Android获取本机图片教程
作为一名经验丰富的开发者,我将通过此篇文章教会你如何在Android应用中实现获取本机图片的功能。下面是整个流程的概览表格:
步骤 | 描述 |
---|---|
步骤一 | 请求存储权限 |
步骤二 | 打开系统相册 |
步骤三 | 选择图片 |
步骤四 | 获取图片路径 |
步骤五 | 加载图片 |
接下来,让我们逐步详细介绍每个步骤的具体操作。
步骤一:请求存储权限
在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
在Activity中添加以下代码以请求权限:
private static final int REQUEST_STORAGE_PERMISSION = 1;
private void requestStoragePermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_STORAGE_PERMISSION);
}
}
在onRequestPermissionsResult
方法中处理权限请求的结果:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_STORAGE_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限已授予
} else {
// 权限被拒绝
}
}
}
步骤二:打开系统相册
在需要打开相册的地方调用以下代码:
private static final int REQUEST_IMAGE_PICK = 2;
private void openGallery() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_IMAGE_PICK);
}
步骤三:选择图片
在Activity中重写onActivityResult
方法,获取选择的图片的URI:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_PICK && resultCode == RESULT_OK && data != null) {
Uri imageUri = data.getData();
// 将图片URI传递给下一步骤
}
}
步骤四:获取图片路径
添加以下依赖库到app的build.gradle文件中:
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
然后在需要获取图片路径的地方调用以下代码:
String imagePath = FileUtils.getPath(this, imageUri);
其中,FileUtils
是一个自定义的工具类,用于将图片URI转换为路径。以下是FileUtils
的代码:
public class FileUtils {
public static String getPath(Context context, Uri uri) {
String path = null;
if (DocumentsContract.isDocumentUri(context, uri)) {
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
path = Environment.getExternalStorageDirectory() + "/" + split[1];
}
} else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.parseLong(id));
path = getDataColumn(context, contentUri, null, null);
} else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{split[1]};
path = getDataColumn(context, contentUri, selection, selectionArgs);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
path = getDataColumn(context, uri, null, null);
} else if ("file".equalsIgnoreCase(uri.getScheme())) {
path = uri.getPath();
}
return path;