Android学习笔记—— 十 、多媒体的基础使用 - 打开相册选取图片
程序员文章站
2022-03-23 23:18:27
...
-
添加运行时权限处理
因为查看相册需要访问SD卡,所以这里需要对WRITE_EXTERNAL_STORAGE这个危险权限进行运行时权限处理。 - 使用隐式Intent打开相册
Intent intent = new Intent("android.intent.action.GET_CONTENT");
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_PHOTO);
- 在onActivityResult方法中处理返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (Build.VERSION.SDK_INT >= 19) {
//Android 4.4以上的版本选取相册的图片返回的Uri为封装的Uri,需要进行解析
handleImageOnkitkat(data);
} else {
//Android 4.4以下的版本选取相册的图片返回的Uri为图片真实的Uri,可以直接进行处理
handleImageBeforeKitKat(data);
}
}
}
@TargetApi(19)
private void handleImageOnkitkat(Intent data) {
String imagePath = null;
Uri uri = data.getData();
//返回的Uri为document类型的处理
if (DocumentsContract.isDocumentUri(this, uri)) {
//取出document id
String docId = DocumentsContract.getDocumentId(uri);
//如果authority部分为media需要对document id进行二次解析
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
//使用正则表达式将id分割取出真正的数字id构建条件语句
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
//EXTERNAL_CONTENT_URI是外部主存储卷的样式URI
imagePath = getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(contentUri, null);
}
}
//其他类型的处理
else if ("content".equalsIgnoreCase(uri.getScheme())) {
imagePath = getImagePath(uri, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
imagePath = uri.getPath();
}
//显示图片
displayImage(imagePath);
}
private void handleImageBeforeKitKat(Intent data) {
//获取打开相册后返回的Intent中携带的Uri
Uri uri = data.getData();
//获取uri中的图片路径
String imagePath = getImagePath(uri, null);
//显示图片
displayImage(imagePath);
}
//通过内容提供器的查询方法获取返回的uri对应的图片的真实路径
private String getImagePath(Uri uri, String selection) {
String path = null;
Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
//通过设置好的ImageView显示获取到的图片
private void displayImage(String imagePath) {
if (imagePath != null) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
img_showPhoto.setImageBitmap(bitmap);
} else {
Toast.makeText(this, "failed to get image", Toast.LENGTH_SHORT).show();
}
}
上一篇: php怎么查询文件夹是否存在