如何在android设备中从pick文件获取绝对路径?

3phpmpom  于 2021-09-13  发布在  Java
关注(0)|答案(3)|浏览(417)

我尝试了很多方法,但并没有返回我想要的路径,我怎样才能得到绝对路径?
这是我找回的

  1. /document/image:29163

意图守则

  1. binding.buttonSetVoiceGallery.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Intent intent = new Intent();
  5. intent.setType("*/*");
  6. intent.setAction(Intent.ACTION_GET_CONTENT);
  7. startActivityForResult(intent, 0);
  8. }
  9. });

当activityresult

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. if (requestCode == 0 && resultCode == RESULT_OK) {
  5. Log.d(TAG,data.getData().getPath());
  6. }
  7. }
kh212irz

kh212irz1#

请尝试以下代码以获取绝对路径:

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. if (requestCode == 0 && resultCode == RESULT_OK) {
  5. Log.d(TAG,data.getData().getPath());
  6. Object objImg = data.getExtras().get("path");
  7. Log.e("Selected", "" + objImg.toString());
  8. /*--getting image uri from object--*/
  9. Uri selectedImage = Uri.parse(String.valueOf(objImg));
  10. Log.e("Selected Image", "" + selectedImage);
  11. /*--create file object using uri--*/
  12. File myFile = new File(selectedImage.getPath());
  13. String path = myFile.getAbsolutePath();
  14. Log.e("AbsolutePath---", ""+path);
  15. }
  16. }
展开查看全部
wmvff8tz

wmvff8tz2#

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. if (requestCode == 0 && resultCode == RESULT_OK) {
  5. if (data != null) {
  6. File file = new File(getFileFromUri(mContext, data.getData()));
  7. Log.i("absolute_path", file.getAbsolutePath());
  8. }
  9. }
  10. }
  11. private static String getFileFromUri(final Context context, final Uri uri) {
  12. if (DocumentsContract.isDocumentUri(context, uri)) {
  13. if (isExternalStorageDocument(uri)) {
  14. final String docId = DocumentsContract.getDocumentId(uri);
  15. final String[] split = docId.split(":");
  16. final String type = split[0];
  17. String path = null;
  18. if ("primary".equalsIgnoreCase(type)) {
  19. if (split.length > 1) {
  20. path = Environment.getExternalStorageDirectory() + "/" + split[1];
  21. } else {
  22. path = Environment.getExternalStorageDirectory() + "/";
  23. }
  24. } else {
  25. path = "storage" + "/" + docId.replace(":", "/");
  26. }
  27. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
  28. try {
  29. MediaStoreUtils mediaStoreUtils = new MediaStoreUtils();
  30. InputStream in = context.getContentResolver().openInputStream(uri);
  31. Uri uriValue = mediaStoreUtils.savePDFFile(context, in, getMimeTypeFromURI(context, uri), "Document_Name");
  32. Log.i("NEWURII = ", uriValue.toString());
  33. if (uriValue != null) {
  34. return getFileFromUri(context, uriValue);
  35. }
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. }
  39. } else
  40. return path;
  41. } else if (isDownloadsDocument(uri)) {
  42. String fileName = getFilePath(context, uri);
  43. if (fileName != null) {
  44. return Environment.getExternalStorageDirectory().toString() + "/Download/" + fileName;
  45. }
  46. final String id = DocumentsContract.getDocumentId(uri);
  47. final Uri contentUri = ContentUris.withAppendedId(
  48. Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
  49. return getDataColumn(context, contentUri, null, null);
  50. } else if (isMediaDocument(uri)) {
  51. final String docId = DocumentsContract.getDocumentId(uri);
  52. final String[] split = docId.split(":");
  53. final String type = split[0];
  54. Uri contentUri = null;
  55. if ("image".equals(type)) {
  56. contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  57. } else if ("video".equals(type)) {
  58. contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
  59. } else if ("audio".equals(type)) {
  60. contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  61. }
  62. final String selection = "_id=?";
  63. final String[] selectionArgs = new String[]{
  64. split[1]
  65. };
  66. return getDataColumn(context, contentUri, selection, selectionArgs);
  67. } else if (isGoogleDocsUri(uri) || isOneDriveUri(uri) || isBoxUri(uri)) {
  68. return getDriveFilePath(uri, context);
  69. }
  70. } else if ("content".equalsIgnoreCase(uri.getScheme())) {
  71. // Return the remote address
  72. if (isGooglePhotosUri(uri))
  73. return uri.getLastPathSegment();
  74. return getDataColumn(context, uri, null, null);
  75. } else if ("file".equalsIgnoreCase(uri.getScheme())) {
  76. return uri.getPath();
  77. }
  78. return null;
  79. }
  80. private static String getDataColumn(Context context, Uri uri, String selection,
  81. String[] selectionArgs) {
  82. Cursor cursor = null;
  83. final String column = "_data";
  84. final String[] projection = {
  85. column
  86. };
  87. try {
  88. cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
  89. null);
  90. if (cursor != null && cursor.moveToFirst()) {
  91. final int index = cursor.getColumnIndexOrThrow(column);
  92. return cursor.getString(index);
  93. }
  94. } finally {
  95. if (cursor != null)
  96. cursor.close();
  97. }
  98. return null;
  99. }
  100. private static String getFilePath(Context context, Uri uri) {
  101. final String[] projection = {
  102. MediaStore.MediaColumns.DISPLAY_NAME
  103. };
  104. try (Cursor cursor = context.getContentResolver().query(uri, projection, null, null,
  105. null)) {
  106. if (cursor != null && cursor.moveToFirst()) {
  107. final int index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME);
  108. return cursor.getString(index);
  109. }
  110. }
  111. return null;
  112. }
  113. public static String getMimeTypeFromURI(Context mContext, Uri uri) {
  114. ContentResolver cR = mContext.getContentResolver();
  115. MimeTypeMap mime = MimeTypeMap.getSingleton();
  116. return cR.getType(uri);
  117. }
  118. private static boolean isExternalStorageDocument(Uri uri) {
  119. return "com.android.externalstorage.documents".equals(uri.getAuthority());
  120. }
  121. private static boolean isDownloadsDocument(Uri uri) {
  122. return "com.android.providers.downloads.documents".equals(uri.getAuthority());
  123. }
  124. private static boolean isMediaDocument(Uri uri) {
  125. return "com.android.providers.media.documents".equals(uri.getAuthority());
  126. }
  127. private static boolean isGooglePhotosUri(Uri uri) {
  128. return "com.google.android.apps.photos.content".equals(uri.getAuthority());
  129. }
  130. private static boolean isGoogleDocsUri(Uri uri) {
  131. return "com.google.android.apps.docs.storage".equals(uri.getAuthority()) || "com.google.android.apps.docs.storage.legacy".equals(uri.getAuthority());
  132. }
  133. private static boolean isOneDriveUri(Uri uri) {
  134. return "com.microsoft.skydrive.content.StorageAccessProvider".equals(uri.getAuthority());
  135. }
  136. private static boolean isBoxUri(Uri uri) {
  137. return "com.box.android.documents".equals(uri.getAuthority());
  138. }
  139. private static String getDriveFilePath(Uri uri, Context context) {
  140. Uri returnUri = uri;
  141. Cursor returnCursor = context.getContentResolver().query(returnUri, null, null, null, null);
  142. /*
  143. * Get the column indexes of the data in the Cursor,
  144. * * move to the first row in the Cursor, get the data,
  145. * * and display it.
  146. * */
  147. int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
  148. int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
  149. returnCursor.moveToFirst();
  150. String name = (returnCursor.getString(nameIndex));
  151. String size = (Long.toString(returnCursor.getLong(sizeIndex)));
  152. File file = new File(context.getFilesDir(), name);
  153. try {
  154. InputStream inputStream = context.getContentResolver().openInputStream(uri);
  155. FileOutputStream outputStream = new FileOutputStream(file);
  156. int read = 0;
  157. int maxBufferSize = 1 * 1024 * 1024;
  158. int bytesAvailable = inputStream.available();
  159. //int bufferSize = 1024;
  160. int bufferSize = Math.min(bytesAvailable, maxBufferSize);
  161. final byte[] buffers = new byte[bufferSize];
  162. while ((read = inputStream.read(buffers)) != -1) {
  163. outputStream.write(buffers, 0, read);
  164. }
  165. Log.e("File Size", "Size " + file.length());
  166. inputStream.close();
  167. outputStream.close();
  168. Log.e("File Path", "Path " + file.getPath());
  169. Log.e("File Size", "Size " + file.length());
  170. } catch (Exception e) {
  171. Log.e("Exception", e.getMessage());
  172. }
  173. return file.getPath();
  174. }
展开查看全部
ymzxtsji

ymzxtsji3#

  1. binding.buttonSetVoiceGallery.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Intent intent = new Intent();
  5. intent.setType("image/*");
  6. intent.setAction(Intent.ACTION_GET_CONTENT);
  7. launcher.launch(intent);
  8. }
  9. });
  10. ActivityResultLauncher<Intent> launcher = registerForActivityResult(
  11. new ActivityResultContracts.StartActivityForResult(),
  12. new ActivityResultCallback<ActivityResult>() {
  13. @Override
  14. public void onActivityResult(ActivityResult result) {
  15. if (result.getResultCode() == Activity.RESULT_OK ) {
  16. Intent data = result.getData();
  17. Uri uri= data.getData();
  18. File file = new File(FileMyutils.getPath(getContext(),uri));
  19. }
  20. }
  21. });
  22. public class FileMyutils {
  23. private static final String TAG = "FileUtils";
  24. @WorkerThread
  25. @Nullable
  26. public static String getReadablePathFromUri(Context context, Uri uri) {
  27. String path = null;
  28. if ("file".equalsIgnoreCase(uri.getScheme())) {
  29. path = uri.getPath();
  30. }
  31. if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
  32. path = getPath(context, uri);
  33. }
  34. if (TextUtils.isEmpty(path)) {
  35. return path;
  36. }
  37. Log.d(TAG, "get path from uri: " + path);
  38. if (!isReadablePath(path)) {
  39. int index = path.lastIndexOf("/");
  40. String name = path.substring(index + 1);
  41. String dstPath = context.getCacheDir().getAbsolutePath() + File.separator + name;
  42. if (copyFile(context, uri, dstPath)) {
  43. path = dstPath;
  44. Log.d(TAG, "copy file success: " + path);
  45. } else {
  46. Log.d(TAG, "copy file fail!");
  47. }
  48. }
  49. return path;
  50. }
  51. public static String getPath(final Context context, final Uri uri) {
  52. final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
  53. if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
  54. if (isExternalStorageDocument(uri)) {
  55. final String docId = DocumentsContract.getDocumentId(uri);
  56. Log.d("External Storage", docId);
  57. final String[] split = docId.split(":");
  58. final String type = split[0];
  59. if ("primary".equalsIgnoreCase(type)) {
  60. return Environment.getExternalStorageDirectory() + "/" + split[1];
  61. }
  62. } else if (isDownloadsDocument(uri)) {
  63. String dstPath = context.getCacheDir().getAbsolutePath() + File.separator + getFileName(context,uri);
  64. if (copyFile(context, uri, dstPath)) {
  65. Log.d(TAG, "copy file success: " + dstPath);
  66. return dstPath;
  67. } else {
  68. Log.d(TAG, "copy file fail!");
  69. }
  70. } else if (isMediaDocument(uri)) {
  71. final String docId = DocumentsContract.getDocumentId(uri);
  72. final String[] split = docId.split(":");
  73. final String type = split[0];
  74. Uri contentUri = null;
  75. if ("image".equals(type)) {
  76. contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  77. } else if ("video".equals(type)) {
  78. contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
  79. } else if ("audio".equals(type)) {
  80. contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  81. }
  82. final String selection = "_id=?";
  83. final String[] selectionArgs = new String[]{split[1]};
  84. return getDataColumn(context, contentUri, selection, selectionArgs);
  85. }
  86. } else if ("content".equalsIgnoreCase(uri.getScheme())) {
  87. return getDataColumn(context, uri, null, null);
  88. } else if ("file".equalsIgnoreCase(uri.getScheme())) {
  89. return uri.getPath();
  90. }
  91. return null;
  92. }
  93. public static String getFileName(Context context, Uri uri) {
  94. Cursor cursor = context.getContentResolver().query(uri,null,null,null,null);
  95. int nameindex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
  96. cursor.moveToFirst();
  97. return cursor.getString(nameindex);
  98. }
  99. private static String getDataColumn(Context context, Uri uri, String selection,
  100. String[] selectionArgs) {
  101. Cursor cursor = null;
  102. final String column = "_data";
  103. final String[] projection = {column};
  104. try {
  105. cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
  106. null);
  107. if (cursor != null && cursor.moveToFirst()) {
  108. final int column_index = cursor.getColumnIndexOrThrow(column);
  109. return cursor.getString(column_index);
  110. }
  111. } finally {
  112. if (cursor != null)
  113. cursor.close();
  114. }
  115. return null;
  116. }
  117. private static boolean isExternalStorageDocument(Uri uri) {
  118. return "com.android.externalstorage.documents".equals(uri.getAuthority());
  119. }
  120. private static boolean isDownloadsDocument(Uri uri) {
  121. return "com.android.providers.downloads.documents".equals(uri.getAuthority());
  122. }
  123. private static boolean isMediaDocument(Uri uri) {
  124. return "com.android.providers.media.documents".equals(uri.getAuthority());
  125. }
  126. private static boolean isReadablePath(@Nullable String path) {
  127. if (TextUtils.isEmpty(path)) {
  128. return false;
  129. }
  130. boolean isLocalPath;
  131. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
  132. if (!TextUtils.isEmpty(path)) {
  133. File localFile = new File(path);
  134. isLocalPath = localFile.exists() && localFile.canRead();
  135. } else {
  136. isLocalPath = false;
  137. }
  138. } else {
  139. isLocalPath = path.startsWith(File.separator);
  140. }
  141. return isLocalPath;
  142. }
  143. private static boolean copyFile(Context context, Uri uri, String dstPath) {
  144. InputStream inputStream = null;
  145. OutputStream outputStream = null;
  146. try {
  147. inputStream = context.getContentResolver().openInputStream(uri);
  148. outputStream = new FileOutputStream(dstPath);
  149. byte[] buff = new byte[100 * 1024];
  150. int len;
  151. while ((len = inputStream.read(buff)) != -1) {
  152. outputStream.write(buff, 0, len);
  153. }
  154. } catch (Exception e) {
  155. e.printStackTrace();
  156. return false;
  157. } finally {
  158. if (inputStream != null) {
  159. try {
  160. inputStream.close();
  161. } catch (Exception e) {
  162. e.printStackTrace();
  163. }
  164. }
  165. if (outputStream != null) {
  166. try {
  167. outputStream.close();
  168. } catch (Exception e) {
  169. e.printStackTrace();
  170. }
  171. }
  172. }
  173. return true;
  174. }
  175. }
展开查看全部

相关问题