2016-09-21 2 views
1

Ich möchte ein Bild in meinen DB-Trog hochladen, indem es in einen base64-String kodiert wird.Warum sagt Android Studio, dass mein BufferedWriter geschlossen ist?

Wenn ich das Bild habe und den "Upload" -Button drücke, macht mein Code das.

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); 
} 

Und hier sind die Methoden und Klasse, die

/*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; 
} 

Und meine Klasse folgt, die den Upload

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(); 
} 

In dieser Klasse behandeln sollte ich erhalten einen Fehler, der mein BufferedWriter geschlossen ist bevor ich meine Methode GetPOSTUrl() ausführen und ich weiß nicht warum. Ich bin mir nicht sicher, wie ich tiefer in dieses Problem eindringen kann.

bearbeiten

Hier ist, wie ich die

Bitmap erhalten
@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); 
    } 
} 

Und das Bitmap ist nur in meiner Klasse

private Uri filepath; 
private Bitmap bitmap; 

Antwort

1

ich heute das gleiche Problem hatte. Versuchen getInputStream(); Aufruf nach an die OutputStream wie dieses schreiben:

... 
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; 
} 
... 

Ich habe absolut keine Ahnung, warum dies geschieht. getInputStream() scheint irgendwie die OutputStream zu schließen. Vielleicht hat das etwas mit dem neuen Android Studio 2.2 zu tun, weil ich dieses Verhalten vorher noch nie bemerkt habe.

+0

Vielen Dank. Ich verlor den Kopf über diesen. Hatte keine Ahnung, dass sich Inputstream so verhielt. – Bojje

Verwandte Themen