2017-04-15 85 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()而不是使用picturePath字符串,但仍然出現錯誤。我哪裏做錯了?這是一個權限相關的問題?

編輯: 堆棧跟蹤:

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

@Dan我在上面! –

+0

可能的重複[什麼是NullPointerException,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it ) – Marvin

回答

1

你取回一個nullUri

首先,嘗試從selectImage()中刪除所有那些putExtra()來電。那些沒有記錄,不受支持,可能會導致您的問題。如果需要,可以選擇許多image-cropping libraries裁剪圖像。

我還建議擺脫query()致電onActivityResult()。添加一個image-loading library並讓它異步加載圖像到您的ImageView,給定Uri。或者,在ContentResolver上使用openInputStream(),將該流傳遞給BitmapFactory上的decodeStream()

+0

我會嘗試。有沒有特定的'putExtra()'我可以保留?我現在將他們全部帶走,但他們會在我的應用程序中有用。 –

+0

@AlexJone:擺脫所有這些,因爲不需要任何「ACTION_PICK」(或其他任何東西)來支持它們。正如我在答覆中所寫,使用圖像裁剪庫。 – CommonsWare

+0

非常感謝,它只是通過取出'putExtras()'而工作。 –