2017-09-07 5 views
1

Hallo Leute Ich arbeite an einem Projekt, das Bilddatei auf dem Server hochlädt. Ich sende Daten an den Server mit Volley. Die Daten, die ich senden werde, enthalten base64 string. Ich stieß auf OutOfMemoryError, als ich eine Bilddatei entschlüsselte. Implementiere ich es richtig? Hier ist mein Code:Android OutOfMemoryError beim Decodieren einer Bitmap

for (int i = 0; i < pathList.size(); i++) { 
    //error occurred here 
     Bitmap image = BitmapFactory.decodeFile(pathList.get(i), options); 
      Log.d("bitmapImage", "nisudSiya" + " " + image); 
      encodedImage = UploadImageHelper.encodeImageBitmap(UploadImageHelper.scaleBitmap(image, 1000, 1000)); 
      stringUri.add(encodedImage); 
     } 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, POST_URL, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String response) { 
       Toast.makeText(CreatePostActivity.this, response.toString(), Toast.LENGTH_SHORT).show(); 
       VolleyApp.getInstance().cancelPendingRequests(PUSH_MULTIPLE_IMAGES); 
       mProgressUpload.dismiss(); 
       finish(); 
       Log.d("tyler", response.toString()); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       error.printStackTrace(); 
       Toast.makeText(CreatePostActivity.this, "Error Uploading!", Toast.LENGTH_SHORT).show(); 
       mProgressUpload.dismiss(); 
       Log.d("tagsdsad23", error.toString()); 
      } 
     }) { 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 

       for (int i = 0; i < stringUri.size(); i++) { 
        Attachment attachment = new Attachment(); 
        attachment.setType("image"); 
        attachment.setUrl(stringUri.get(i)); 
        shit.add(attachment); 
       } 
       Log.d("shitsize", String.valueOf(shit.size())); 
       JSONArray jsonArray = new JSONArray(); 
       for (int i = 0; i < shit.size(); i++) { 
        try { 
         JSONObject jsonObject = new JSONObject(); 
         Log.d("shittype", shit.get(i).getUrl()); 
         jsonObject.put("type", shit.get(i).getType()); 
         jsonObject.put("url", shit.get(i).getUrl()); 
         jsonArray.put(jsonObject); 
         Log.d("tyler-gwapa", jsonObject.toString()); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
       Log.d("tyler-gwapa", jsonArray.toString()); 

       Map<String, String> params = new HashMap<String, String>(); 
       params.put(USER_TOKEN, userToken); 
       params.put(CAPTION, postContent.getText().toString()); 
       params.put(ATTACHMENT, jsonArray.toString()); 
       return params; 
      } 
     }; 
     VolleyApp.getInstance().addToRequestQueue(stringRequest, PUSH_MULTIPLE_IMAGES_TAG); 
+2

Bild .compress (Bitmap.CompressFormat.JPEG, 100 , outStream); Bild komprimieren, bevor Sie an den Server senden ...! –

+0

Ich habe bereits getan in: encodedImage = UploadImageHelper.encodeImageBitmap (UploadImageHelper.scaleBitmap (image, 1000, 1000)); –

+0

Sie sind encodedImage Bild nicht komprimieren ..! Sobald Sie das Bild komprimieren, reduzieren Sie die Größe des Bildes ... –

Antwort

0

Bild komprimieren, bevor Sie an den Server senden ...!

image .compress(Bitmap.CompressFormat.JPEG, 100, outStream); 

ich hoffe es ist hilfreich für Sie ...!

1

Versuchen Sie Folgendes, um Bitmap zu komprimieren und zu codieren.

Bitmap selectedImage = getResizedBitmap(yourBitmaptoCompress, 350, 350); 

definieren getResizedBitmap Methode

public Bitmap getResizedBitmap(Bitmap image, int bitmapWidth, int 
    bitmapHeight) { 
    return Bitmap.createScaledBitmap(image, bitmapWidth, bitmapHeight, 
    true); 
} 

Encode Bild-Bitmap (Base64)

String encodedImage = encodeImage(selectedImage); 

definieren encodeImage Method

private String encodeImage(Bitmap bm) { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bm.compress(Bitmap.CompressFormat.JPEG, 30, baos); 
    byte[] b = baos.toByteArray(); 
    String encImage = Base64.encodeToString(b, Base64.DEFAULT); 
    return encImage; 
} 
+0

Bitmap selectedImage = getResizedBitmap (selectedImage, 350, 350); selectedImage wird zweimal verwendet? –

+0

Bitte beachten Sie die aktualisierte Antwort –

+0

die Werte von H und W, die 350 ist, ist es notwendig, 350 zu haben? oder wie hast du 350 abgeleitet? –

Verwandte Themen