2017-04-15 4 views
0

사용자가 이미지를 선택하고 이미지보기에서 이미지를 처리하도록 처리 할 수있게하겠습니다. 지금까지 내가 가진 :이미지 선택시 앱이 충돌 함

public void selectImage(View view) { 
    Intent intent = new Intent(Intent.ACTION_PICK, 
      MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
    intent.setType("image/*"); 
    intent.putExtra("crop", "true"); 
    intent.putExtra("scale", true); 
    intent.putExtra("outputX", 256); 
    intent.putExtra("outputY", 256); 
    intent.putExtra("aspectX", 1); 
    intent.putExtra("aspectY", 1); 
    intent.putExtra("return-data", true); 
    startActivityForResult(intent, PICK_IMAGE); 
} 


//called at runtime 
    private void requestPermission() { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_WRITE_PERMISSION); 
     } else { 
      selectImage(null); 
     } 
    } 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
    if (requestCode == REQUEST_WRITE_PERMISSION && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     selectImage(null); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    final int RESULT_LOAD_IMAGE = 1; 


    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data != null) { 
     Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

      Cursor cursor = getContentResolver().query(selectedImage, 
        filePathColumn, null, null, null); 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String picturePath = cursor.getString(columnIndex); 
      cursor.close(); 

      ImageView imageView = (ImageView) findViewById(R.id.cImg); 
      imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 


    } 


} 

을 지금, 나는이 줄에 오류를 받고 있어요 : Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); 나는 의아해 해요. 커서를 꺼내고 그림 경로 문자열 대신 selectedImage.getPath()selectedImage.getEncodedPath()을 사용했지만 오류가 발생했습니다. 나는 어디로 잘못 갔는가? 권한 관련 문제입니까?

편집 : 스택 추적 :

04-15 16:46:08.154 20055-20055/com.dannyyyy.isitabanana E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.dannyyyy.isitabanana, PID: 20055 
                      java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.dannyyyy.isitabanana/com.dannyyyy.isitabanana.MainActivity}: java.lang.NullPointerException: uri 
                       at android.app.ActivityThread.deliverResults(ActivityThread.java:4089) 
                       at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132) 
                       at android.app.ActivityThread.-wrap20(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6119) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
                      Caused by: java.lang.NullPointerException: uri 
                       at com.android.internal.util.Preconditions.checkNotNull(Preconditions.java:111) 
                       at android.content.ContentResolver.query(ContentResolver.java:515) 
                       at android.content.ContentResolver.query(ContentResolver.java:474) 
                       at com.dannyyyy.isitabanana.MainActivity.onActivityResult(MainActivity.java:217) 
                       at android.app.Activity.dispatchActivityResult(Activity.java:6932) 
                       at android.app.ActivityThread.deliverResults(ActivityThread.java:4085) 
                       at android.app.ActivityThread.handleSendResult(ActivityThread.java:4132)  
                       at android.app.ActivityThread.-wrap20(ActivityThread.java)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1533)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:154)  
                       at android.app.ActivityThread.main(ActivityThread.java:6119)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)  
+2

게시 스택 추적 –

+0

@ 단! –

+0

가능한 [NullPointerException은 무엇이며 어떻게 수정합니까?] (http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it)) – Marvin

답변

1

당신은 nullUri을 다시 얻고있다.

먼저 putExtra() 번의 전화를 모두 selectImage()에서 삭제하십시오. 그것들은 문서화되지 않았고, 지원되지 않으며, 문제를 일으킬 수도 있습니다. 원하는 경우 이미지를 자르기 위해 선택할 수있는 많은 image-cropping libraries이 있습니다.

query() 전화 번호는 onActivityResult()입니다. image-loading library에 추가하고 Uri 인 경우 비동기식으로 이미지를 ImageView에로드하십시오. 또는 ContentResolver에서 openInputStream()을 사용하고 해당 스트림을 decodeStream()BitmapFactory에 전달합니다.

+0

나는 시험해 볼 것이다. 내가 유지할 수있는 특정 'putExtra()'가 있습니까? 지금 당장 그들을 모두 없애 겠지만 내 앱에는 유용 ​​할 것입니다. –

+0

@AlexJone : 모든 ACTION_PICK (또는 다른 어떤 것도)를 지원할 필요가 없기 때문에 모든 것을 제거하십시오. 내 대답에 쓴 것처럼 이미지 자르기 라이브러리를 사용하십시오. – CommonsWare

+0

고마워, 그냥 putExtras()를 꺼내서 작업했다. –