2016-09-21 9 views
1

base64-stringにエンコードしてDBトラフに画像をアップロードします。なぜ私のBufferedWriterが閉じられているとアンドロイドスタジオは言っていますか?

画像があり、「アップロード」ボタンを押すと、私のコードがこれを行います。

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

そして、ここでは、このクラスでは、アップロード

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

を処理する必要があり

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

そして、私のクラスを次のメソッドおよびクラス私は私なBufferedWriterが閉じられているエラーを受け取ります私の方法を実行する前にGetPOSTUrl()と私はなぜか分からない。私はこの問題を深く掘り下げる方法がわかりません。ここで

編集

は、私は、ビットマップ

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

を受信し、ビットマップは、私は今日と同じ問題を抱えていた私のクラスの中

private Uri filepath; 
private Bitmap bitmap; 

答えて

1

である。どのようにありますこのようなOutputStreamへの書き込み後getInputStream();を呼び出してみてください。

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

私はなぜこれが起こっている絶対にないアイデアを持っていません。 getInputStream()はどういうわけかOutputStreamを閉じているようです。たぶんこれは新しいAndroid Studio 2.2と関係があります

+0

ありがとうございます。これ以上頭を失っていた。 Inputstreamがそのような振る舞いをしているという考えはありませんでした。 – Bojje

関連する問題