2016-09-21 1 views
1

Je veux télécharger une image dans mon creux de la base de données en l'encodant en base64-String.Pourquoi android studio dit-il que mon BufferedWriter est fermé?

Lorsque j'ai l'image et que j'appuie sur le bouton «upload», mon code le fait.

private void upLoadPicture() 
{ 
    class UploadImage extends AsyncTask<Bitmap,Void,String> 
    { 
     //ProgressDialog loading; 
     @Override 
     protected String doInBackground(Bitmap... args) { 
      RequestHandler rh = new RequestHandler(); 
      Bitmap tempBitmap = args[0]; 
      String tempImageString = ConvertBitMapToString(tempBitmap); 
      HashMap<String,String> map = new HashMap<String,String>(); 
      map.put(UPLOAD_KEY, tempImageString); 
      rh.SendPostRequest(DATABASE_REQUEST_PATH, map); 
      return null; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // loading = ProgressDialog.show(getApplicationContext(), "Uploading Image", "Please wait", true,true); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
     // loading.dismiss(); 
     } 
    } 

    UploadImage Upi = new UploadImage(); 
    Upi.execute(bitmap); 
} 

Et voici les méthodes et la classe qui suit

/*We store the picture in the database as a encoded 64-Base String so we need to encode it first*/ 
protected String ConvertBitMapToString(Bitmap bm) 
{ 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bm.compress(Bitmap.CompressFormat.JPEG,100,baos); 
    byte[] b = baos.toByteArray(); 
    String tempString = Base64.encodeToString(b,Base64.DEFAULT); 
    return tempString; 
} 

Et ma classe qui devrait gérer le téléchargement

public class RequestHandler { 

public void SendPostRequest(String url, HashMap<String,String> map) 
{ 
    String tempMessage,a = ""; 
    HashMap<String,String> ImageHashmap = map; 
    try { 
     URL sendmeurl = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) sendmeurl.openConnection(); 

     con.setRequestMethod("POST"); 
     con.setDoOutput(true); 
     con.setDoInput(true); 

     OutputStream os = con.getOutputStream(); 
     InputStream is = con.getInputStream(); 

     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 

     bw.write(GetPOSTURL(ImageHashmap)); 
     bw.flush(); 
     bw.close(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
     while ((tempMessage = br.readLine()) != null){ 
      a = tempMessage; 
     } 
     Log.d("recieve", a); 
     con.disconnect(); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

private String GetPOSTURL(HashMap<String,String> MapPOST) 
{ 
    StringBuilder result = new StringBuilder(); 
    boolean first = true; 
    for (Map.Entry<String, String> entry : MapPOST.entrySet()) { 
     if (first) 
      first = false; 
     else 
      result.append("&"); 

     try { 
      result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); 
      result.append("="); 
      result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    return result.toString(); 
} 

Dans cette classe, je reçois une erreur que mon BufferedWriter est fermé avant que j'exécute ma méthode GetPOSTUrl() et je ne sais pas pourquoi. Je ne suis pas sûr de savoir comment approfondir ce problème.

Modifier

Voici comment je reçois le bitmap

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null) { 
     filepath = data.getData(); 
     try { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},FETCH_PICTURE_REQUEST); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode){ 
     case FETCH_PICTURE_REQUEST: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
       try { 
        bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filepath); 
        _IV.setImageBitmap(bitmap); 
       } catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } else { 
       Toast.makeText(getApplicationContext(), "No Permission", Toast.LENGTH_SHORT).show(); 
      } 
     break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

Et le Bitmap est juste dans ma classe

private Uri filepath; 
private Bitmap bitmap; 

Répondre

1

J'ai eu le même problème aujourd'hui. Essayez d'appeler getInputStream(); après avoir écrit au OutputStream comme ceci:

... 
con.setRequestMethod("POST"); 
con.setDoOutput(true); 
con.setDoInput(true); 

OutputStream os = con.getOutputStream(); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 

bw.write(GetPOSTURL(ImageHashmap)); 
bw.flush(); 
bw.close(); 

InputStream is = con.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
while ((tempMessage = br.readLine()) != null){ 
    a = tempMessage; 
} 
... 

Je ne sais absolument pas pourquoi cela se passe. getInputStream() semble fermer le OutputStream en quelque sorte. Peut-être que cela a quelque chose à voir avec le nouveau Android Studio 2.2 parce que je n'ai jamais remarqué ce comportement auparavant.

+0

Merci. Je perdais la tête par rapport à celui-ci. Je n'avais aucune idée que Inputstream se comportait de cette manière. – Bojje