在我的安卓应用中访问图片来自“图片”应用程序

45
和 iPhone 中的 UIImagePickerController 允许用户访问设备上存储的图片一样,我们在 Android SDK 中是否有类似的控件可供使用?
谢谢。

1
我相信你需要的是一个名为android.provider的内容提供者和一个名为MediaStore.Images的类。更多信息可以在这里找到。 - GregD
3个回答

87

你可以使用startActivityForResult,传入一个描述要完成的操作和执行该操作的数据源的Intent。

幸运的是,Android包含一个用于选择事物的Action:Intent.ACTION_PICK,以及一个包含图片的数据源: android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI用于本地设备上的图像或 android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI用于SD卡上的图像。

调用startActivityForResult,传入选择操作和您希望用户从中选择的图像:

startActivityForResult(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI), SELECT_IMAGE);

然后覆盖onActivityResult以监听用户已做出选择。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == SELECT_IMAGE)
    if (resultCode == Activity.RESULT_OK) {
      Uri selectedImage = data.getData();
      // TODO Do something with the select image URI
    } 
}

一旦你获得了图像的Uri,你就可以使用它来访问该图像并进行任何你需要做的事情。


当我使用这个时,我的onActivityResult没有被调用...有什么建议吗?我已经设置了外部存储权限。 - Mahendran
要查看如何从selectedImage变量中准确获取文件路径,请查看此答案:https://dev59.com/_Wkv5IYBdhLWcg3wnCDH#10474167 - Bitcoin Cash - ADA enthusiast

22

你还可以这样做:

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, 1);

这将选择所有存储中的图像。


相机能否作为附加源显示在这里? - jjxtra
如果您在startActivityForResult()中传递了静态的1,那么您如何在onActivityResult()中识别请求代码? - Johnny Wu

1

更新一下Reto的回答。你可以这样缩放图片:

private String getPath(Uri uri) {
String[]  data = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(context, uri, data, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接