Android 获取手机本地图片地址问题和解决方案
好了,思想+代码。
关于不能得到手机里图片问题分析:
1.获取的地址是否是绝对地址。
Java 工具类
/**
* Created by aierJun
*/
public class ImageUtil {
/**
* Method for return file path of Gallery image
*
* @param context
* @param uri
* @return path of the selected image file from gallery
*/
@SuppressLint(
"NewApi")
public static String
getPath(
final Context context,
final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
if (isKitKat && 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)) {
return 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.valueOf(id));
return 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] };
return getDataColumn(context, contentUri, selection,
selectionArgs);
}
}
else if (
"content".equalsIgnoreCase(uri.getScheme())) {
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(context, uri,
null,
null);
}
else if (
"file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
/**
* Get the value of the data column for this Uri. This is useful for
* MediaStore Uris, and other file-based ContentProviders.
*
* @param context
* The context.
* @param uri
* The Uri to query.
* @param selection
* (Optional) Filter used in the query.
* @param selectionArgs
* (Optional) Selection arguments used in the query.
* @return The value of the _data column, which is typically a file path.
*/
public static String
getDataColumn(Context context, Uri uri,
String selection, String[] selectionArgs) {
Cursor cursor =
null;
final String column =
"_data";
final String[] projection = { column };
try {
cursor = context.getContentResolver().query(uri, projection,
selection, selectionArgs,
null);
if (cursor !=
null && cursor.moveToFirst()) {
final int index = cursor.getColumnIndexOrThrow(column);
return cursor.getString(index);
}
}
finally {
if (cursor !=
null)
cursor.close();
}
return null;
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is ExternalStorageProvider.
*/
public static boolean isExternalStorageDocument(Uri uri) {
return "com.android.externalstorage.documents".equals(uri
.getAuthority());
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is DownloadsProvider.
*/
public static boolean isDownloadsDocument(Uri uri) {
return "com.android.providers.downloads.documents".equals(uri
.getAuthority());
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is MediaProvider.
*/
public static boolean isMediaDocument(Uri uri) {
return "com.android.providers.media.documents".equals(uri
.getAuthority());
}
/**
* @param uri
* The Uri to check.
* @return Whether the Uri authority is Google Photos.
*/
public static boolean isGooglePhotosUri(Uri uri) {
return "com.google.android.apps.photos.content".equals(uri
.getAuthority());
}
}
2.读写权限是否授权
1.Android 6.0以下设备无需考虑
2.Android 6.0以上设备新特性
除了在manifest里面配置权限外,还必须动态授权,不然获取不到图片资源或者崩溃
解决方案一:
targetSdkVersion23改为22,降级。现在创建默认23.(不建议,不是最终方案)
解决方案二:
修改代码为动态授权(最终解决方案)
关于动态授权有时间会在下篇中做详细说明。
转载请注明原文地址: https://ju.6miu.com/read-666864.html