简体   繁体   中英

Android - InputStream not working correctly

I'm trying to figure out why my inputstream isn't working correctly. I am trying to connect to a server and get a JSON string and save it into the variable inputJSON. However inputJOSN is empty because my inputstream isn't working correctly. This line of code:

 inputJSON = ConvertByteArrayToString(getBytesFromInputStream(inputStr));

doesn't seem to be working properly and I'm not sure why?

public class AndroidClient extends ProfileActivity {

private TextView textIn;

public Thread rt;
public Socket socket = null;
public PrintWriter outputstrwr;
public OutputStream out = null; 
public DataOutputStream dataOutputStream = null;
public DataInputStream dataInputStream = null;

public InputStream inputStr = null;

private final static String LOG_TAG = AndroidClient.class.getSimpleName();
private final Handler handler = new Handler();
private List<Profile> serviceInfoList = new ArrayList<Profile>();

// Map between list position and profile
private Map<Integer, Profile> posMap = new HashMap<Integer, Profile>();
private Map<String, Integer> addressMap = new HashMap<String, Integer>();

private static String profilePicBase64Str="";
private String inputJSON = "";
private String outputJSON = "";
private String outputJSONserv = "";
private Profile p;
//String urlInputStream = "";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Log.e(LOG_TAG, "Before OnCreate() Try");
    try {
        Log.e(LOG_TAG, "In OnCreate() Try");
        socket = new Socket("23.23.175.213", 9000);  //Port 1337
        Log.e(LOG_TAG, "Created Socket");
        dataOutputStream = new DataOutputStream(socket.getOutputStream());
        Log.e(LOG_TAG, "Created DataOutputStream");
        dataInputStream = new DataInputStream(socket.getInputStream());
        Log.e(LOG_TAG, "Created DataInputStream");

        //out = new OutputStream();
        out = socket.getOutputStream();
        inputStr = socket.getInputStream();

        //Thread readjsonthrd = new Thread(new ReadJSONThread());
        //inputstrrd = new InputStreamReader(socket.getInputStream());

        p = new Profile();
        Log.e(LOG_TAG, "Created Profile Instance");

        //Gets the local profile via JSON and converts into Profile type
        Gson gson = new Gson();
        Log.e(LOG_TAG, "Created Gson Instance" + "GetProfileJSONStr:" + p.getProfileJSONStr());
        p = gson.fromJson(p.getProfileJSONStr(), Profile.class);
        setProfile(p);
        Log.e(LOG_TAG, "Converted Profile to JSON");

        //Gson gson = new Gson();
        Log.e(LOG_TAG, "Before: outputJSON = gson.toJson(p);");
        outputJSON = gson.toJson(p).toString();
        outputJSON = removeExcessStr(outputJSON);
        Log.e(LOG_TAG, "ProfilePicStr Base64:"+p.getProfilePicStr());

        outputJSON = outputJSON.replace("Name","name");
        outputJSON = outputJSON.replace("TagLine","message");
        outputJSON = outputJSON.replace("Title","title");
        outputJSON = outputJSON.replace("Company", "company");
        outputJSON = outputJSON.replace("Industry","industry");
        outputJSON = outputJSON.replace("WhatIDo","whatido");
        outputJSON = outputJSON.replace("WhoDoIWantToMeet","meetwho");
        outputJSON = outputJSON.replace("WHOOZNEAR_PROFILEPIC","photo");
        outputJSON = outputJSON.replaceAll("[c][o][n][t][e][n][t][:][/][/][a-zA-Z0-9]+[/][a-zA-Z0-9]+[/][a-zA-Z0-9]+[/][a-zA-Z0-9]+[/][a-zA-Z0-9]+", getPicBase64Str()); /*"helloworld2"*/

        if (!outputJSON.contains(",\"photo\":")) { 
            outputJSON = outputJSON.replace("}",",\"photo\":"+"\"IconnexUs\"}");
            outputJSON = outputJSON.replace("}",",\"photo\":"+"\""+getPicBase64Str()+"\"}");
            outputJSON = outputJSON.replace("}",",\"status\":\"enabled\"}");
        }
        else { 
            outputJSON = outputJSON.replace("}",",\"status\":\"enabled\"");
        }

        outputJSONserv = "{\"to\":\"broadcast\",\"type\":\"1\",\"payload\":"+outputJSON+"}";

        Log.e(LOG_TAG, "Created outputJSON:" + outputJSON);
        Log.e(LOG_TAG, "Created outputJSON Server:" + outputJSONserv);
        JSONObject outObject = new JSONObject();
        try {
            outObject.put("photo", "hello");
            outObject.put("type", "50");
            outObject.put("payload", outputJSON);
            outputJSON = gson.toJson(outObject).toString();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Log.e(LOG_TAG, "Value of PROFILEPIC STRING FROM PROFILEMAP: "+profileMap.get("WHOOZNEAR_PROFILEPIC"));
        p.setProfilePicStr(ConvertandSetImagetoBase64(profileMap.get("WHOOZNEAR_PROFILEPIC")));
        //String headerJSON = gson.toJson(outObject).toString();
        outputJSON = outputJSON.substring(nthOccurrence(outputJSON, '{', 2)-1, nthOccurrence(outputJSON, '}', 1)-1);

        String input = "["+"Ryan"+"[";
        //"[foo".replaceAll(Pattern.quote("["), "\""); 
        String result = input.replaceAll(Pattern.quote("["), "\"");
        Log.e(LOG_TAG, "REGEX REPLACEALL:"+result);

        outputstrwr = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
        outputstrwr.write(outputJSONserv);

        Log.e(LOG_TAG, "Base64 String:"+p.getProfilePicStr());
        Log.e(LOG_TAG, "Sent dataOutputStream");
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Log.e(LOG_TAG, "Before initEventHandlers");
    initEventHandlers();
    Log.e(LOG_TAG, "After initEventHandlers");
    //refreshViewModels();

    Log.e(LOG_TAG, "Start Repeat Thread");
    rt = new Thread(new RepeatingThread());
    rt.start();
    Log.e(LOG_TAG, "Started Repeat Thread");
}

@Override
public void onDestroy() {
    super.onDestroy();
    rt.stop();
    try {
        socket.close();
        dataOutputStream.close();
        dataInputStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Override
public void onPause(){
    super.onPause();
    rt.stop();
}

@Override
public void onResume(){
    super.onResume();
    if (rt.isAlive() == false) {
        //rt.start();
    }
}

@Override
public void onStop(){
    super.onStop();
    rt.stop();
    try {
        socket.close();
        dataOutputStream.close();
        dataInputStream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public static String removeExcessStr(String json_excess) {      
    //String myString = myString.replace("=\"ppshein\"", "");
    String json_excess1 = json_excess.replace("\"nameValues\":{", "");
    String myString = json_excess1.replace(",\"profileId\":1,\"valid\":false}", "");
    return myString;
}
public static String adddblquotattr(String attr) { 
    String result = attr.replaceAll(Pattern.quote("["), "\"");
    return result;
}

public static String adddblquotval(String val) { 
    String result = val.replaceAll(Pattern.quote("["), "\"");
    return result;
}

public static int nthOccurrence(String str, char c, int n) {
    int pos = str.indexOf(c, 0);
    while (n-- > 0 && pos != -1)
        pos = str.indexOf(c, pos+1);
    return pos;
}

public void setPicBase64Str(String profilePicBase64Str) {
    this.profilePicBase64Str = profilePicBase64Str;
}

public String getPicBase64Str() {
    return profilePicBase64Str;
}

public String ConvertandSetImagetoBase64(String imagePath) { 
    String base64 = null;
    byte[] input = null;

    try{
        FileInputStream fd = new FileInputStream(imagePath);
        Bitmap bmt = BitmapFactory.decodeFileDescriptor(fd.getFD());

        try{                
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            Bitmap tmp = ProfileActivity.scaleDownBitmap(bmt, 10, this);
            tmp.compress(Bitmap.CompressFormat.JPEG, 10, stream);
            input = stream.toByteArray();
            base64 = Base64.encodeToString(input, Base64.DEFAULT);
            //LocalProfileActivity.input = input;
        }catch(Exception e){
            Log.e(LOG_TAG,"[ONACTIVITYRESULT] Could not bind input to the bytearray: " + e.getMessage());
        }
    }
    catch (Exception e){
        Log.e("LocalProfile", "ConvertandSetImagetoBase64: Could not load selected profile image");
    }
    return base64;
}

public String getStringFromBuffer(InputStreamReader inputstrread){
    BufferedReader bRead = new BufferedReader(inputstrread);
    String line = null;
    StringBuffer jsonText = new StringBuffer();
    try {
        while((line=bRead.readLine())!=null){
           jsonText.append(line);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return jsonText.toString();
}

public String ConvertByteArrayToString(byte[] b) { 
    // byte[] to string
    String input = new String(b);
    return input;
}

public byte[] ConvertStringToByteArray(String str) { 
    // string to byte[]
    byte[] bytes = str.getBytes();
    return bytes;
}

public static byte[] getBytesFromInputStream(InputStream is)
        throws IOException {

        // Get the size of the file
        long length = is.available();

        if (length > Integer.MAX_VALUE) {
        // File is too large
        }

        // Create the byte array to hold the data
        byte[] bytes = new byte[(int) length];

        // Read in the bytes
        int offset = 0;
        int numRead = 0;
        while (offset < bytes.length
        && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
        offset += numRead;
        }
        // Ensure all the bytes have been read in
        if (offset < bytes.length) {
        throw new IOException("Could not completely stream ");
        }
        // Close the input stream and return bytes
        is.close();
        return bytes;
}

public static String writeFile(Bitmap finalBitmap) { 
    String filePath = "";

    String root = Environment.getExternalStorageDirectory().toString();
    File myDir = new File(root + "/saved_images");    
        myDir.mkdirs();
        Random generator = new Random();
        int n = 10000;
        n = generator.nextInt(n);
        String fname = "Image-"+ n +".jpg";
        File file = new File (myDir, fname);
        if (file.exists ()) file.delete (); 
        try {
               FileOutputStream outFile = new FileOutputStream(file);
               finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, outFile);
               outFile.flush();
               outFile.close();

        } catch (Exception e) {
               e.printStackTrace();
        }
    filePath = root+"/saved_images/"+fname;
    return filePath;
}

public class RepeatingThread implements Runnable {

     private final Handler mHandler = new Handler();
     private int len = 0; 


     private byte[] input = new byte[len];


     public RepeatingThread() {
         //try {
            Log.e(LOG_TAG, "Before inputJSON String");
            //inputJSON = dataInputStream.readUTF();
            //URL url = new URL("tcp://23.23.175.213:1337");
            //inputJSON = dataInputStream.readUTF();
            //inputstrrd = new InputStreamReader(socket.getInputStream());
            String hello = "hello world";
            //String inputJSON = getStringFromBuffer(new InputStreamReader(socket.getInputStream()));

            //Convert 
            Log.e(LOG_TAG, "After inputJSON String:" + inputJSON); 
         /*}
         catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }*/

         //LOOK HERE FIRST  
         //inputJSON is what is received back from the server - Take the inputJSON 
         //String and use regular expressions HERE to remove all the other characters in the 
         //string except the payload JSON.
         //refreshViewModels(inputJSON);
     }

     @Override
     public void run() { 
          try {
              //outputstrwr.write(outputJSONserv);  //UNCOMMENT IF NEED TO SEND DATA TO GET JSON BACK
              inputJSON = ConvertByteArrayToString(getBytesFromInputStream(inputStr));
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }

          Log.e(LOG_TAG, "IN REPEATINGTHREAD-INPUTJSON:" + inputJSON);
          refreshViewModels(inputJSON);
          mHandler.postDelayed(this, 3000);       
     }
}

    public void refreshViewModels(String inputJSON) {

        try {
            ListView servicesListView = (ListView) this
                    .findViewById(R.id.profilesListView);

            String[] from = new String[] { "profilePic", "neighborName",
                    "tagLine" };
            int[] to = new int[] { R.id.avatar, R.id.username, R.id.email };

            // prepare the list of all records
            List<HashMap<String, Object>> fillMaps = new ArrayList<HashMap<String, Object>>();
            List<Profile> profiles = new ArrayList<Profile>();

            // Clear the position mapping list and reset it
            this.posMap.clear();
            Log.i(LOG_TAG, "NEW inputJSON: " + inputJSON);
            inputJSON = getPayloadStr(inputJSON);
            Log.i(LOG_TAG, "NEW inputJSON2: " + inputJSON);
            JSONArray profileArray = new JSONArray(inputJSON);

            for (int i=0; i<profileArray.length(); i++) { 
                JSONObject jsonObject = profileArray.getJSONObject(i);
                Gson gson = new Gson(); 
                Profile p = gson.fromJson(gson.toJson(jsonObject).toString(), Profile.class);
                profiles.add(p);
            }

            int pos = 0;

            // Creates the fillMaps list for the listAdapter
            Log.i(LOG_TAG, "Profiles size: " + profiles.size());
            //showToast("Profiles size: " + profiles.size());
            for (Profile p : profiles) {
                // Create mapping for list adapter
                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put("profilePic",
                        p.getAttributeValue("photo")== null? "Not Set" : p
                                .getAttributeValue("photo"));
                map.put("neighborName",
                        p.getAttributeValue("Name") == null? "Not Set" : p
                                .getAttributeValue("Name"));
                map.put("tagLine",
                        p.getAttributeValue("TagLine") == null? "Not Set" : p
                                .getAttributeValue("TagLine"));
                fillMaps.add(map);

                // Reset the postion mapping
                this.posMap.put(pos++, p);

            }

            ListAdapter servicesListAdapter = new myAdapter(this, fillMaps,
                    R.layout.listitem, from, to);
            servicesListView.setAdapter(servicesListAdapter);

        } catch (Exception e) {
            Log.e(LOG_TAG, "Error making list adapter: " + e.getMessage());
        }

    }

    public String getPayloadStr(String profileString) {
        Log.e("LOG_TAG", "Profile Str:"+profileString);
        Pattern pattern = Pattern.compile(".*?payload\":(.*)\\}");

        Log.e("LOG_TAG", "I got here 1");
        Matcher matcher = pattern.matcher(profileString);
        Log.e("LOG_TAG", "I got here 12");
        //Matcher m = responseCodePattern.matcher(firstHeader);
        matcher.matches();
        matcher.groupCount();
        //matcher.group(0);
        Log.e("LOG_TAG", "I got here 2"+matcher.group(1));
        return matcher.group(1);
    }


     private class myAdapter extends SimpleAdapter {

            public myAdapter(Context context, List<? extends Map<String, ?>> data,
                    int resource, String[] from, int[] to) {
                super(context, data, resource, from, to);

            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                if (convertView == null) {
                    convertView = getLayoutInflater().inflate(R.layout.listitem,
                            null);
                }

                HashMap<String, Object> data = (HashMap<String, Object>) getItem(position);

                ((TextView) convertView.findViewById(R.id.username))
                        .setText((String) data.get("neighborName"));

                ((TextView) convertView.findViewById(R.id.email))
                .setText((String) data.get("tagLine"));


                // Convert a string representing an image back to an image
                String base64 = ((String)data.get("profilePic"));
                byte[] picBytes = Base64.decode(base64, Base64.DEFAULT);  
                Bitmap bitmap = BitmapFactory.decodeByteArray(picBytes, 0, picBytes.length);


                //THE IF AND THE ELSE NEED TO BE SWITCHED
                if (bitmap==null){
                    ((ImageView) convertView.findViewById(R.id.avatar)).setImageResource(R.drawable.btn_whooznear);
                }else{
                    ((ImageView) convertView.findViewById(R.id.avatar)).setImageBitmap(bitmap);
                }

                return convertView;
            }

        }

     public void callProfileActivity(int position)
     { 
         // Catch the case when service info is empty
         if(serviceInfoList.size()==0){
             return;
         }
         Profile profClick = posMap.get(position);
         String b64Str = profClick.getAttributeValue("photo");

         Intent startViewActivity = new Intent();
         startViewActivity.putExtra("TransProfile", (Profile)posMap.get(position));
         startViewActivity.putExtra("PhotoBase64", b64Str);
         if(serviceInfoList.size()>position){
             //DO SOMETHING HERE
         }else{
             Log.e(LOG_TAG,"Profile doesn't exist in sevice infoList? Selecting first one");
         }
         startViewActivity.setClass(this, ViewProfileActivity.class);
         startActivity(startViewActivity);
     }
    /**
     * Initialize the event handlers
     */
    public void initEventHandlers() {
        // Service List View
        ListView servicesListView = (ListView) this
                .findViewById(R.id.profilesListView);
        servicesListView
                .setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    public void onItemClick(AdapterView<?> arg0, View v,
                            int position, long id) {
                        Profile clickedProfile = posMap.get(position);
                        //showToast("Clicked Pos: " + position);

                        /*Intent intent = new Intent(ConnectActivity.this, ViewProfileActivity.class);
                        intent.putExtra("ClickProfile", posMap.get(position));*/

                        callProfileActivity(position);  
                    }
                });
    }

    /*@Override 
    public void onBackPressed() { // do something on back.
         super.onBackPressed();
         Intent myIntent = new Intent(AndroidClient.this, ProfileActivity.class);
         startActivity(myIntent);
         return; 
    }*/
}

Your code is rather long, so I cannot be sure of what exactly is the problem, but there is definitely an issue here:

public static byte[] getBytesFromInputStream(InputStream is)
    throws IOException {

    // Get the size of the file
    long length = is.available();

If you are calling this right after sending your URL request, the server may not have had time to send the result back, so is.available() may return zero or another value less than the actual number of bytes you would hope would be available. Try code like this for reading in the file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM