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

发布时间:2019-08-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Android打开手机相册获取图片路径脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

本文实例为大家分享了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 + "=&#63;";     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());  } }
android教程
脚本网站
android studio

脚本宝典总结

以上是脚本宝典为你收集整理的Android打开手机相册获取图片路径全部内容,希望文章能够帮你解决Android打开手机相册获取图片路径所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。