2016-11-06 12 views
0

私はカメラから写真を撮るアンドロイドアプリを持っていますが、それをbase64形式に変換したいのですが、撮影した写真を受け入れる。私は外部ストレージにアクセスすることができないようで、これはヌルビットマップにつながると思います。アンドロイドマンネストの許可証が宣告されました。権限の問題を解決するにはどうすればよいでしょうか。また、何がヌルビットマップにつながる可能性がありますか?ビットマップがnullであるので、私はラインAndroid:ストリームをデコードできません:bitmapFactory.decodeFile()のjava.io.FileNotFoundException

bitmap.compress(Bitmap.CompressFormat.JPEG, 50, stream) 

にエラーが発生します

public class MainActivity extends AppCompatActivity { 

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


private String getRealPathFromURI(Uri contentUri) { 
    String[] proj = { MediaStore.Images.Media.DATA }; 
    CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null); 
    Cursor cursor = loader.loadInBackground(); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    String result = cursor.getString(column_index); 
    cursor.close(); 
    return result; 
} 

@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_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) { 

     BitmapFactory.Options options = new BitmapFactory.Options(); 

     int scale = 8; 
     options.inSampleSize = scale; 
     options.inJustDecodeBounds = false; 
     bitmap = BitmapFactory.decodeFile(file_uri.getPath(), options); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 50, 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); 
} 


} 

は、ここに私のコードです。

E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/Pictures/test123.jpg: open failed: EACCES (Permission denied) 
E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
       Process: com.example.andrei.sendphotos, PID: 17972 
       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:115) 
        at com.example.andrei.sendphotos.MainActivity$Encode_image.doInBackground(MainActivity.java:92) 
        at android.os.AsyncTask$2.call(AsyncTask.java:295) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
        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)  
E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa23ae0e0 

のAndroidマニフェストのXML::アプリを実行した後

クラッシュがこのエラー/メッセージを返さ

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.andrei.sendphotos"> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-feature android:name="android.hardware.camera" android:required="true" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 


<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

+0

あなたのandroid.manifest.xmlを表示できます –

+0

私は今投稿を更新します。最後の段落をご覧ください。 –

+0

http://stackoverflow.com/questions/26579869/how-can-i-let-users-access-the-internal-storage-directory-of-my-app –

答えて

0

あなたはAndroidの6の実行時のアクセス許可を実装する必要があります。バツ。ここでは、公式ドキュメントを参照してください:Requesting Runtime Permissions

ここに私自身のような使用可能なパブリックヘルパークラスがあります。PermissionHelper.java

それとも、単に、あまりにもその私は「wouldnターゲットSDKの22のバージョンとすべての依存関係をダウングレードすることができお勧めします。


Android 6.Xの主な変更点の1つは、強制実行時アクセス許可モデルでした。 Googleは既に市場にあるアプリケーション(実行時にアクセス許可を確認したり尋ねたりしない)との下位互換性を保つ必要がありました。

このように、アプリケーションがSDKバージョン22を対象とする場合、すべての権限がインストール時にアプリケーションに与えられます。しかし、アプリケーションがSDK 23を対象とする場合、既定ではアクセス許可が与えられず、アプリケーションはdangerous permissionsを必要とするタスクを実行する前にアクセス許可をチェックし、まだ許可されていない場合はユーザーに依頼してください。

+0

エミュレータ(テストデバイス)をSDK 22にダウングレードした後、アプリケーションは正常に動作します!しかし、私はそれが23 sdkで動作しない理由を理解できませんでした。いくつか言葉で説明してください。 –

+0

確かに、更新された答えを確認してください。 –

+0

ありがとうございました!これは私が3日間解決できなかった私の問題を解決した –

関連する問題