• Android 系统文件浏览器


    1.调用系统文件浏览器

    1. Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    2. intent.setType("*/*");//设置类型,我这里是任意类型,任意后缀的可以这样写。
    3. //intent.setType(“image/*”);//选择图片
    4. //intent.setType(“audio/*”); //选择音频
    5. //intent.setType(“video/*”); //选择视频 (mp4 3gp 是android支持的视频格式)
    6. //intent.setType(“video/*;image/*”);//同时选择视频和图片
    7. intent.addCategory(Intent.CATEGORY_OPENABLE);
    8. startActivityForResult(intent, 1000);

    2.接受选中回调

    1. @Override
    2. protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    3. super.onActivityResult(requestCode, resultCode, data);
    4. try {
    5. if (resultCode == Activity.RESULT_OK && requestCode == 1000) {
    6. Uri uri = data.getData();//得到uri,后面就是将uri转化成file的过程。
    7.             String absolutePath = FileChooseUtil.uriToPath(this, uri);
    8. Log.e("选择了文件", "文件路径:" + absolutePath);
    9. readExcel(absolutePath);
    10. }
    11. } catch (Exception e) {
    12. e.printStackTrace();
    13. }
    14. }

    3.Uri转绝对路径

    1. package com.example.exportfile;
    2. import android.annotation.SuppressLint;
    3. import android.content.ContentUris;
    4. import android.content.Context;
    5. import android.database.Cursor;
    6. import android.net.Uri;
    7. import android.os.Build;
    8. import android.os.Environment;
    9. import android.provider.DocumentsContract;
    10. import android.provider.MediaStore;
    11. import android.widget.Toast;
    12. public class FileChooseUtil {
    13. private static Context context;
    14. private static FileChooseUtil util = null;
    15. private FileChooseUtil(Context context) {
    16. this.context = context;
    17. }
    18. public static FileChooseUtil getInstance(Context context) {
    19. if (util == null) {
    20. util = new FileChooseUtil(context);
    21. }
    22. return util;
    23. }
    24. /**
    25. * 对外接口 获取uri对应的路径
    26. *
    27. * @param uri
    28. * @return
    29. */
    30. public String getChooseFileResultPath(Uri uri) {
    31. String chooseFilePath = null;
    32. if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开
    33. chooseFilePath = uri.getPath();
    34. Toast.makeText(context, chooseFilePath, Toast.LENGTH_SHORT).show();
    35. return chooseFilePath;
    36. }
    37. if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后
    38. chooseFilePath = getPath(context, uri);
    39. } else {//4.4以下下系统调用方法
    40. chooseFilePath = getRealPathFromURI(uri);
    41. }
    42. return chooseFilePath;
    43. }
    44. public static String getRealPathFromURI(Uri contentUri) {
    45. String res = null;
    46. String[] proj = {MediaStore.Images.Media.DATA};
    47. Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
    48. if (null != cursor && cursor.moveToFirst()) {
    49. int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    50. res = cursor.getString(column_index);
    51. cursor.close();
    52. }
    53. return res;
    54. }
    55. public static String uriToPath(Context context, Uri uri) {
    56. if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后
    57. return FileChooseUtil.getPath(context, uri);
    58. } else {//4.4以下下系统调用方法
    59. return FileChooseUtil.getRealPathFromURI(uri);
    60. }
    61. }
    62. /**
    63. * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
    64. */
    65. @SuppressLint("NewApi")
    66. public static String getPath(final Context context, final Uri uri) {
    67. final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
    68. // DocumentProvider
    69. if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
    70. // ExternalStorageProvider
    71. if (isExternalStorageDocument(uri)) {
    72. final String docId = DocumentsContract.getDocumentId(uri);
    73. final String[] split = docId.split(":");
    74. final String type = split[0];
    75. if ("primary".equalsIgnoreCase(type)) {
    76. return Environment.getExternalStorageDirectory() + "/" + split[1];
    77. }
    78. }
    79. // DownloadsProvider
    80. else if (isDownloadsDocument(uri)) {
    81. final String id = DocumentsContract.getDocumentId(uri);
    82. final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
    83. return getDataColumn(context, contentUri, null, null);
    84. }
    85. // MediaProvider
    86. else if (isMediaDocument(uri)) {
    87. final String docId = DocumentsContract.getDocumentId(uri);
    88. final String[] split = docId.split(":");
    89. final String type = split[0];
    90. Uri contentUri = null;
    91. if ("image".equals(type)) {
    92. contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    93. } else if ("video".equals(type)) {
    94. contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    95. } else if ("audio".equals(type)) {
    96. contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    97. }else if ("document".equals(type)) {
    98. contentUri = MediaStore.Files.getContentUri("external");
    99. }
    100. final String selection = "_id=?";
    101. final String[] selectionArgs = new String[]{split[1]};
    102. return getDataColumn(context, contentUri, selection, selectionArgs);
    103. }
    104. }
    105. // MediaStore (and general)
    106. else if ("content".equalsIgnoreCase(uri.getScheme())) {
    107. return getDataColumn(context, uri, null, null);
    108. }
    109. // File
    110. else if ("file".equalsIgnoreCase(uri.getScheme())) {
    111. uri.getPath();
    112. }
    113. return null;
    114. }
    115. private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
    116. Cursor cursor = null;
    117. final String column = "_data";
    118. final String[] projection = {column};
    119. try {
    120. cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
    121. null);
    122. if (cursor != null && cursor.moveToFirst()) {
    123. final int column_index = cursor.getColumnIndexOrThrow(column);
    124. return cursor.getString(column_index);
    125. }
    126. } finally {
    127. if (cursor != null)
    128. cursor.close();
    129. }
    130. return null;
    131. }
    132. /**
    133. * @param uri The Uri to check.
    134. * @return Whether the Uri authority is ExternalStorageProvider.
    135. */
    136. private static boolean isExternalStorageDocument(Uri uri) {
    137. return "com.android.externalstorage.documents".equals(uri.getAuthority());
    138. }
    139. /**
    140. * @param uri The Uri to check.
    141. * @return Whether the Uri authority is DownloadsProvider.
    142. */
    143. private static boolean isDownloadsDocument(Uri uri) {
    144. return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    145. }
    146. /**
    147. * @param uri The Uri to check.
    148. * @return Whether the Uri authority is MediaProvider.
    149. */
    150. private static boolean isMediaDocument(Uri uri) {
    151. return "com.android.providers.media.documents".equals(uri.getAuthority());
    152. }
    153. }

  • 相关阅读:
    安卓配置图标——Qt For Android
    产品思维训练 | 从海底捞涨价看产品价格调整的一些考虑
    【华为OD机试真题 python】 最大N个数与最小N个数的和【2022 Q4 | 100分】
    园子周边第2季:黑色大鼠标垫已上架,大气简洁与五彩缤纷的融合
    MHA高可用配置及故障切换
    Spring Cloud项目(六)——使用sentinel作为流控管理
    【C语言】函数的定义、传参与调用(二)
    高薪程序员&面试题精讲系列129之你熟悉哪些版本控制工具?你知道哪些Git命令?fetch与pull有哪些区别?
    220V转18V非隔离降压芯片:满足多种应用需求
    机器学习笔记 十八:基于3种方法的随机森林模型分析房屋参数重要性
  • 原文地址:https://blog.csdn.net/qq_36488374/article/details/126955385