2016-11-06 3 views
0

카메라에서 사진을 찍은 다음 base64 형식으로 변환하고 싶지만 이후에 오류가 있습니다. 찍은 사진을 수락합니다. 외부 저장소에 액세스 할 수없는 것처럼 보입니다. 그리고 이것이 null 비트 맵으로 연결됩니다. ANDROID_MANIFEST의 허가가 선언되었습니다. 권한 문제를 해결하고 null 비트 맵을 유발할 수있는 사항은 무엇입니까? 비트 맵이 null이기 때문에이 라인안드로이드 스트림을 디코딩 할 수 없습니다 : 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 

안드로이드 매니페스트 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

당신은 안드로이드 6 런타임 권한을 구현해야합니다. 엑스. 여기에 공식 문서를 참조하십시오 Requesting Runtime Permissions

여기 내 자신의 일처럼 사용 가능한 공공 헬퍼 클래스가 있습니다 PermissionHelper.java

또는 당신은 단순히 너무하는 내가 '같으면 대상 SDK의 22 버전에 모든 종속성을 다운 그레이드 할 수 좋습니다.


Android 6.X의 주요 변경 사항 중 하나는 강제 실행 권한 모델입니다. Google은 이미 시장에 나와있는 응용 프로그램 (런타임에 사용 권한을 확인하거나 요청하지 않음)에 대해 이전 버전과의 호환성을 유지해야했습니다.

그래서 그들은 응용 프로그램이 SDK 버전 22를 대상으로 할 경우 모든 권한이 설치시 응용 프로그램에 부여됩니다. 그러나 응용 프로그램이 SDK 23을 대상으로하는 경우에는 기본적으로 사용 권한이 부여되지 않고 응용 프로그램은 dangerous permissions이 필요한 작업을 수행하기 전에 사용 권한을 확인하고 사용자에게 부여하지 않은 경우 사용자에게 요청하여 계속 진행합니다.

+0

에뮬레이터 (테스트 장치)를 SDK 22로 다운 그레이드 한 후 앱이 정상적으로 작동합니다! 그러나 나는 왜 그것이 23 sdk에서 작동하지 않는지 이해할 수 없었다. 몇 마디로 설명해 주시겠습니까? –

+0

물론, 업데이트 된 답변을 확인하십시오. –

+0

대단히 감사합니다!이 3 일 동안 해결할 수없는 내 문제를 해결 –

관련 문제