首页 > 系统 > Android > 正文

Android打开手机相册获取图片路径

2019-12-12 00:13:01
字体:
来源:转载
供稿:网友

本文实例为大家分享了Android打开手机相册获取图片路径的具体代码,供大家参考,具体内容如下

根据打开相机返回的Uri uri = data.getData();获取该相片的真正SD卡路径!

权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

动态申请权限

String[] mPermissionList = new String[]{   Manifest.permission.WRITE_EXTERNAL_STORAGE,   Manifest.permission.READ_EXTERNAL_STORAGE}; public static final int REQUEST_PICK_IMAGE = 11101;

打开手机相册

ActivityCompat.requestPermissions(MainActivity.this, mPermissionList, 100);
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {  super.onRequestPermissionsResult(requestCode, permissions, grantResults);  switch (requestCode) {   case 100:    boolean writeExternalStorage = grantResults[0] == PackageManager.PERMISSION_GRANTED;    boolean readExternalStorage = grantResults[1] == PackageManager.PERMISSION_GRANTED;    if (grantResults.length > 0 && writeExternalStorage && readExternalStorage) {     getImage();    } else {     Toast.makeText(this, "请设置必要权限", Toast.LENGTH_SHORT).show();    }    break;  } } private void getImage() {  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {   startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT).setType("image/*"),     REQUEST_PICK_IMAGE);  } else {   Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);   intent.addCategory(Intent.CATEGORY_OPENABLE);   intent.setType("image/*");   startActivityForResult(intent, REQUEST_PICK_IMAGE);  } }

获取相册返回的Uri

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {  super.onActivityResult(requestCode, resultCode, data);  if (resultCode == Activity.RESULT_OK) {   switch (requestCode) {    case REQUEST_PICK_IMAGE:     if (data != null) {      String realPathFromUri = RealPathFromUriUtils.getRealPathFromUri(this, data.getData());     } else {      Toast.makeText(this, "图片损坏,请重新选择", Toast.LENGTH_SHORT).show();     }     break;   }  } }

这里的data.getData()返回的就是Uri,realPathFromUri 为真正路径

获取真正路径

package com.example.richeditortest;import android.annotation.SuppressLint;import android.content.ContentUris;import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.os.Build;import android.provider.DocumentsContract;import android.provider.MediaStore;public class RealPathFromUriUtils { /**  * 根据Uri获取图片的绝对路径  *  * @param context 上下文对象  * @param uri  图片的Uri  * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null  */ public static String getRealPathFromUri(Context context, Uri uri) {  int sdkVersion = Build.VERSION.SDK_INT;  if (sdkVersion >= 19) { // api >= 19   return getRealPathFromUriAboveApi19(context, uri);  } else { // api < 19   return getRealPathFromUriBelowAPI19(context, uri);  } } /**  * 适配api19以下(不包括api19),根据uri获取图片的绝对路径  *  * @param context 上下文对象  * @param uri  图片的Uri  * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null  */ private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {  return getDataColumn(context, uri, null, null); } /**  * 适配api19及以上,根据uri获取图片的绝对路径  *  * @param context 上下文对象  * @param uri  图片的Uri  * @return 如果Uri对应的图片存在, 那么返回该图片的绝对路径, 否则返回null  */ @SuppressLint("NewApi") private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {  String filePath = null;  if (DocumentsContract.isDocumentUri(context, uri)) {   // 如果是document类型的 uri, 则通过document id来进行处理   String documentId = DocumentsContract.getDocumentId(uri);   if (isMediaDocument(uri)) { // MediaProvider    // 使用':'分割    String id = documentId.split(":")[1];    String selection = MediaStore.Images.Media._ID + "=?";    String[] selectionArgs = {id};    filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);   } else if (isDownloadsDocument(uri)) { // DownloadsProvider    Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId));    filePath = getDataColumn(context, contentUri, null, null);   }  } else if ("content".equalsIgnoreCase(uri.getScheme())) {   // 如果是 content 类型的 Uri   filePath = getDataColumn(context, uri, null, null);  } else if ("file".equals(uri.getScheme())) {   // 如果是 file 类型的 Uri,直接获取图片对应的路径   filePath = uri.getPath();  }  return filePath; } /**  * 获取数据库表中的 _data 列,即返回Uri对应的文件路径  *  * @return  */ private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {  String path = null;  String[] projection = new String[]{MediaStore.Images.Media.DATA};  Cursor cursor = null;  try {   cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);   if (cursor != null && cursor.moveToFirst()) {    int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);    path = cursor.getString(columnIndex);   }  } catch (Exception e) {   if (cursor != null) {    cursor.close();   }  }  return path; } /**  * @param uri the Uri to check  * @return Whether the Uri authority is MediaProvider  */ private 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 DownloadsProvider  */ private static boolean isDownloadsDocument(Uri uri) {  return "com.android.providers.downloads.documents".equals(uri.getAuthority()); }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表