opening an image using Intent.ACTION_PICK

2019-02-24 09:07发布

I am trying to open an image using intent.ACTION_PICK but when I start the activity using startActivityForResoult my app crashes. Any clues of what I am doing wrong?

    public void button_load_image(View view) {
    String path = Environment.getExternalStorageDirectory()
            .getAbsolutePath() + "/" + SimpleCamera.getAlbumName();
    File f = new File(path);

    if (f.exists()) {
        Log.d("button_load_image", "folder exists");
        if (f.isDirectory()) {
            Log.d("button_load_image", "is directory");
            Uri u = Uri.fromFile(f);
            Intent intent = new Intent(Intent.ACTION_PICK, u);
            Log.d("Intent.ACTION_PICK", "IS CREATED");              
            startActivityForResult(intent, REQUEST_CODE_LOAD_IMAGE);                
        }
    }
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case REQUEST_CODE_LOAD_IMAGE:
        if (resultCode == RESULT_OK) {
            Uri imageUri= data.getData();
            Log.d("image selected path", imageUri.getPath());
        }
        break;
    }
}

The log shows:

08-13 17:11:37.594: D/libEGL(3265): loaded /vendor/lib/egl/libEGL_POWERVR_SGX540_120.so
08-13 17:11:37.594: D/libEGL(3265): loaded /vendor/lib/egl/libGLESv1_CM_POWERVR_SGX540_120.so
08-13 17:11:37.602: D/libEGL(3265): loaded /vendor/lib/egl/libGLESv2_POWERVR_SGX540_120.so
08-13 17:11:37.664: D/OpenGLRenderer(3265): Enabling debug mode 0
08-13 17:11:46.672: D/album != null(3265): /storage/emulated/0
08-13 17:11:49.914: D/button_load_image(3265): folder exists
08-13 17:11:49.914: D/button_load_image(3265): is directory
08-13 17:11:49.914: D/Intent.ACTION_PICK(3265): IS CREATED
08-13 17:11:49.922: D/AndroidRuntime(3265): Shutting down VM
08-13 17:11:49.922: W/dalvikvm(3265): threadid=1: thread exiting with uncaught exception (group=0x413b0930)
08-13 17:11:49.930: E/AndroidRuntime(3265): FATAL EXCEPTION: main
08-13 17:11:49.930: E/AndroidRuntime(3265): java.lang.IllegalStateException: Could not execute method of the activity
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.view.View$1.onClick(View.java:3597)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.view.View.performClick(View.java:4202)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.view.View$PerformClick.run(View.java:17340)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.os.Handler.handleCallback(Handler.java:725)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.os.Looper.loop(Looper.java:137)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.app.ActivityThread.main(ActivityThread.java:5039)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at java.lang.reflect.Method.invoke(Method.java:511)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at dalvik.system.NativeStart.main(Native Method)
08-13 17:11:49.930: E/AndroidRuntime(3265): Caused by: java.lang.reflect.InvocationTargetException
08-13 17:11:49.930: E/AndroidRuntime(3265):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at java.lang.reflect.Method.invoke(Method.java:511)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.view.View$1.onClick(View.java:3592)
08-13 17:11:49.930: E/AndroidRuntime(3265):     ... 11 more
08-13 17:11:49.930: E/AndroidRuntime(3265): Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.PICK dat=file:///storage/emulated/0/simple_pic }
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1622)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1417)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.app.Activity.startActivityForResult(Activity.java:3370)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at android.app.Activity.startActivityForResult(Activity.java:3331)
08-13 17:11:49.930: E/AndroidRuntime(3265):     at com.example.mc.MC_Memu.button_load_image(MC_Memu.java:53)
08-13 17:11:49.930: E/AndroidRuntime(3265):     ... 14 more

2条回答
成全新的幸福
2楼-- · 2019-02-24 09:22

ACTION_PICK is to allow a user to select an image from any of the installed apps which registered for such an action. It is not possible to specify from which album to select. It is at the user discretion to decide which app to use and to browse to the desired album to select the photo.

So taking out the folder parameter, you can try this:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, REQUEST_CODE_LOAD_IMAGE);

And in the onActivityResult, besides the RESULT_OK, you should also check for data.getData() != null, as an app could close correctly (not cancelling) without returning an image at all.

查看更多
Explosion°爆炸
3楼-- · 2019-02-24 09:24
public class MainActivity extends AppCompatActivity {
ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView= findViewById(R.id.image);
}

public void openImage(View view) {
    Intent intent= new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    startActivityForResult(intent,100);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode==100&&resultCode==RESULT_OK){
        Uri uri=data.getData();
        imageView.setImageURI(uri);
    }
}

}

查看更多
登录 后发表回答