2016-11-05 14 views
0

私はアンドロイドから写真を撮ってサーバーに投稿しようとしていますが、私がアプリを実行すると、私はカメラにアクセスして写真を撮って写真を受け入れた後にクラッシュすることができますイメージをbase64に変換してサーバーに送信する必要があります。どうして? Encode_imageクラス:(エラーが79行であるbitmap.compress(Bitmap.CompressFormat.JPEG、100、ストリーム);Androidビットマップ圧縮エラー

クラッシュエラーは次のとおりです。ここで

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/test123.jpg: open failed: EACCES (Permission denied) 
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
       Process: com.example.andrei.sendphotos, PID: 3870 
       java.lang.RuntimeException: An error occurred while executing doInBackground() 
        at android.os.AsyncTask$3.done(AsyncTask.java:309) 
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
        at java.lang.Thread.run(Thread.java:818) 
       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference 
        at com.example.andrei.sendphotos.MainActivity$Encode_image.doInBackground(MainActivity.java:79) 
        at com.example.andrei.sendphotos.MainActivity$Encode_image.doInBackground(MainActivity.java:72) 
        at android.os.AsyncTask$2.call(AsyncTask.java:295) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 

は私のコードです:

public class MainActivity extends AppCompatActivity { 

private Button takePhotoButton; 
private String encoded_string, image_name; 
private Bitmap bitmap; 
private File file; 
private Uri file_uri; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    takePhotoButton = (Button) findViewById(R.id.take_photo); 
    takePhotoButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      getFileUri(); 
      i.putExtra(MediaStore.EXTRA_OUTPUT, file_uri); 
      startActivityForResult(i, 10); 
     } 
    }); 
} 




private void getFileUri() { 
    image_name= "test123.jpg"; 
    //file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator + image_name); 
    file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + image_name); 
    file_uri = Uri.fromFile(file); 
} 




@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == 10 && resultCode == RESULT_OK){ 
     new Encode_image().execute(); 
    } 
} 


private class Encode_image extends AsyncTask<Void, Void, Void>{ 

    @Override 
    protected Void doInBackground(Void... params) { 

     bitmap = BitmapFactory.decodeFile(file_uri.getPath()); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 


     //convert stream to byte array 
     byte[] array = stream.toByteArray(); 
     encoded_string = Base64.encodeToString(array, 0); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     makeRequest(); 
    } 
} 

private void makeRequest() { 
    RequestQueue requestQueue = Volley.newRequestQueue(this); 
    StringRequest request = new StringRequest(Request.Method.POST, "http://192.168.1.102/AndroidFileUpload/connection.php", 

      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 

     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      HashMap<String, String> map = new HashMap<>(); 
      map.put("encoded_string", encoded_string); 
      map.put("image_name", image_name); 

      return map; 
     } 
    }; 
    requestQueue.add(request); 
} 

} 
+0

原因:java.lang.NullPointerException: '。 Google for NullPointerException。 – greenapps

+1

'bitmap == null'' decodeFile() 'が' null'を返しました。これはおそらくメモリに収まらないビットマップに展開される大きなjpgファイルを使用することによって起こります。小さなjpg画像でコードを試してください。 – greenapps

+0

私は今それを確認します –

答えて

1
を支援します

実際のパスを取得しているのに実際のパスが必要なために問題が発生している可能性があります。

0

あなたのアプリで外部ストレージ に書き込むための権限を与えているAndroidManifest?

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

または外部記憶装置から読み取るためのこの1:あなたがあなたのコード内で明示的に許可を求める必要がある6アンドロイドやデバイス上で使用している場合

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

か...

希望は、これは

+0

私はこの権限を持っています。私は、アプリケーションをデバッグするとき、私はビットマップがnullであると思う、これは問題の原因かもしれない:ヌルビットマップを圧縮する –