Android 中选择本地文件并获取文件路径

打印 上一主题 下一主题

主题 1040|帖子 1040|积分 3120

1. 使用Intent.ACTION_GET_CONTENT(实用于较简朴的文件选择场景)

步调一:在Activity中启动文件选择器

  1. private static final int FILE_SELECT_CODE = 1;
  2. private void showFileChooser() {
  3.     Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  4.     intent.setType("*/*"); // 设置为选择所有类型文件,可根据需要修改,如 "application/pdf" 表示只选择 PDF 文件
  5.     startActivityForResult(intent, FILE_SELECT_CODE);
  6. }
复制代码
步调二:在onActivityResult中获取文件Uri并尝试转换为路径

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3.     super.onActivityResult(requestCode, resultCode, data);
  4.     if (requestCode == FILE_SELECT_CODE && resultCode == RESULT_OK) {
  5.         Uri uri = data.getData();
  6.         String filePath = getPathFromUri(uri);
  7.         Log.d("File Path", filePath);
  8.         // 可以在这里对获取到的文件路径进行后续操作,如读取文件内容等
  9.     }
  10. }
复制代码
步调三:实现getPathFromUri方法来处置惩罚不同类型的Uri获取路径

  1. public String getPathFromUri(Uri uri) {
  2.     String path = null;
  3.     if ("content".equalsIgnoreCase(uri.getScheme())) {
  4.         Cursor cursor = getContentResolver().query(uri, null, null, null, null);
  5.         if (cursor!= null) {
  6.             if (cursor.moveToFirst()) {
  7.                 int index = cursor.getColumnIndex("_data");
  8.                 if (index > -1) {
  9.                     path = cursor.getString(index);
  10.                 }
  11.             }
  12.             cursor.close();
  13.         }
  14.     } else if ("file".equalsIgnoreCase(uri.getScheme())) {
  15.         path = uri.getPath();
  16.     }
  17.     return path;
  18. }
复制代码
2. 使用Storage Access Framework(更通用且安全,特殊是对于 Android 4.4 及以上版本)

步调一:启动文件选择器

  1. private static final int REQUEST_CODE_OPEN_DOCUMENT = 1;
  2. private void openDocument() {
  3.     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
  4.     intent.addCategory(Intent.CATEGORY_OPENABLE);
  5.     intent.setType("*/*");
  6.     startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);
  7. }
复制代码
步调二:在onActivityResult中处置惩罚选择结果并获取路径

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3.     super.onActivityResult(requestCode, resultCode, data);
  4.     if (requestCode == REQUEST_CODE_OPEN_DOCUMENT && resultCode == RESULT_OK) {
  5.         Uri uri = data.getData();
  6.         String filePath = getPathFromSAFUri(uri);
  7.         Log.d("File Path", filePath);
  8.     }
  9. }
复制代码
步调三:实现getPathFromSAFUri方法来处置惩罚SAF相关的Uri获取路径

  1. public String getPathFromSAFUri(Uri uri) {
  2.     if (DocumentsContract.isDocumentUri(this, uri)) {
  3.         if (isExternalStorageDocument(uri)) {
  4.             String docId = DocumentsContract.getDocumentId(uri);
  5.             String[] split = docId.split(":");
  6.             if ("primary".equals(split[0])) {
  7.                 return Environment.getExternalStorageDirectory() + "/" + split[1];
  8.             }
  9.         } else if (isDownloadsDocument(uri)) {
  10.             String id = DocumentsContract.getDocumentId(uri);
  11.             Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
  12.             return getDataColumn(this, contentUri, null, null);
  13.         } else if (isMediaDocument(uri)) {
  14.             String docId = DocumentsContract.getDocumentId(uri);
  15.             String[] split = docId.split(":");
  16.             String type = split[0];
  17.             Uri contentUri = null;
  18.             if ("image".equals(type)) {
  19.                 contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  20.             } else if ("video".equals(type)) {
  21.                 contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
  22.             } else if ("audio".equals(type)) {
  23.                 contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  24.             }
  25.             String selection = "_id=?";
  26.             String[] selectionArgs = new String[]{split[1]};
  27.             return getDataColumn(this, contentUri, selection, selectionArgs);
  28.         }
  29.     } else if ("content".equalsIgnoreCase(uri.getScheme())) {
  30.         return getDataColumn(this, uri, null, null);
  31.     } else if ("file".equalsIgnoreCase(uri.getScheme())) {
  32.         return uri.getPath();
  33.     }
  34.     return null;
  35. }
  36. private boolean isExternalStorageDocument(Uri uri) {
  37.     return "com.android.externalstorage.documents".equals(uri.getAuthority());
  38. }
  39. private boolean isDownloadsDocument(uri) {
  40.     return "com.android.providers.downloads.documents".equals(uri.getAuthority());
  41. }
  42. private boolean isMediaDocument(uri) {
  43.     return "com.android.providers.media.documents".equals(uri.getAuthority());
  44. }
  45. public String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
  46.     Cursor cursor = null;
  47.     final String column = "_data";
  48.     final String[] projection = {column};
  49.     try {
  50.         cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);
  51.         if (cursor!= null && cursor.moveToFirst()) {
  52.             int columnIndex = cursor.getColumnIndexOrThrow(column);
  53.             return cursor.getString(columnIndex);
  54.         }
  55.     } finally {
  56.         if (cursor!= null)
  57.             cursor.close();
  58.     }
  59.     return null;
  60. }
复制代码
至此就完成了在Android中选择文件并获取路径的方法,可以根据自己的需求举行调解

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我可以不吃啊

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表