如何在android中获取pdf文件的实际文件路径?

时间:2017-06-01 10:39:46

标签: android

我使用此代码成功获取了视频文件的实际地址。

Uri selectedVideo = data.getData();
String[] filePathColumn = {MediaStore.Video.Media.DATA};
Cursor cursor = getContentResolver().query(selectedVideo, filePathColumn, null, null, null);
assert cursor != null;
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
mediaPath1 = cursor.getString(columnIndex);

由于Pdf不是媒体文件,我无法使用MediaStore。

使用下面提到的代码给了我“content://com.android.providers.media.documents / .....”作为路径

实际上我正在使用改装2将pdf文件上传到服务器。 当我将文件管理器中显示的地址硬编码到mediapath1时,我能够成功上传文件。

我找到了许多从uri获取地址的解决方案,但没有人给我正确的地址。

提前致谢。

Uri uri = data.getData();
File file = new File(uri.toString());
mediaPath1 = file.getAbsolutePath();
uploadPdf();

3 个答案:

答案 0 :(得分:2)

花了好几个小时后我终于得到了答案。

http://www.limbaniandroid.com/2014/03/how-to-get-absolute-path-when-select.html

import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;

public class ImageFilePath 
{


 /**
  * Method for return file path of Gallery image 
  * 
  * @param context
  * @param uri
  * @return path of the selected image file from gallery
  */
 public static String getPath(final Context context, final Uri uri) 
 {

  //check here to KITKAT or new version
  final boolean isKitKat = Build.VERSION.SDK_INT >= 
  Build.VERSION_CODES.KITKAT;

  // DocumentProvider
  if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

   // ExternalStorageProvider
   if (isExternalStorageDocument(uri)) {
   final String docId = DocumentsContract.getDocumentId(uri);
   final String[] split = docId.split(":");
   final String type = split[0];

   if ("primary".equalsIgnoreCase(type)) {
    return Environment.getExternalStorageDirectory() + "/" + split[1];
   }
  }
  // DownloadsProvider
  else if (isDownloadsDocument(uri)) {

   final String id = DocumentsContract.getDocumentId(uri);
   final Uri contentUri = ContentUris.withAppendedId(
   Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

   return getDataColumn(context, contentUri, null, null);
  }
  // MediaProvider
  else if (isMediaDocument(uri)) {
    final String docId = DocumentsContract.getDocumentId(uri);
    final String[] split = docId.split(":");
    final String type = split[0];

    Uri contentUri = null;
    if ("image".equals(type)) {
       contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    } else if ("video".equals(type)) {
       contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
    } else if ("audio".equals(type)) {
       contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    }

   final String selection = "_id=?";
   final String[] selectionArgs = new String[] {
   split[1]
 };

  return getDataColumn(context, contentUri, selection, selectionArgs);
 }
}
 // MediaStore (and general)
 else if ("content".equalsIgnoreCase(uri.getScheme())) {

     // Return the remote address
     if (isGooglePhotosUri(uri))
     return uri.getLastPathSegment();

    return getDataColumn(context, uri, null, null);
  }
  // File
  else if ("file".equalsIgnoreCase(uri.getScheme())) {
   return uri.getPath();
   }

   return null;
 }

 /**
  * Get the value of the data column for this Uri. This is useful for
  * MediaStore Uris, and other file-based ContentProviders.
  *
  * @param context The context.
  * @param uri The Uri to query.
  * @param selection (Optional) Filter used in the query.
  * @param selectionArgs (Optional) Selection arguments used in the query.
  * @return The value of the _data column, which is typically a file path.
  */
 public static String getDataColumn(Context context, Uri uri, String selection,
   String[] selectionArgs) {

  Cursor cursor = null;
  final String column = "_data";
  final String[] projection = {
   column
  };

  try {
   cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
 null);
   if (cursor != null && cursor.moveToFirst()) {
    final int index = cursor.getColumnIndexOrThrow(column);
   return cursor.getString(index);
   }
  } finally {
   if (cursor != null)
    cursor.close();
  }
  return null;
 }

 /**
  * @param uri The Uri to check.
  * @return Whether the Uri authority is ExternalStorageProvider.
  */
 public static boolean isExternalStorageDocument(Uri uri) {
  return "com.android.externalstorage.documents".equals(uri.getAuthority());
 }

 /**
  * @param uri The Uri to check.
  * @return Whether the Uri authority is DownloadsProvider.
  */
 public static boolean isDownloadsDocument(Uri uri) {
  return 
"com.android.providers.downloads.documents".equals(uri.getAuthority());
 }

 /**
  * @param uri The Uri to check.
  * @return Whether the Uri authority is MediaProvider.
  */
 public 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 Google Photos.
  */
 public static boolean isGooglePhotosUri(Uri uri) {
  return 
"com.google.android.apps.photos.content".equals(uri.getAuthority());
 }`enter code here`
}

答案 1 :(得分:0)

将那个pdf文件复制到缓存目录后我解决了,请在此处检查完整的解决方案:

uploading

感谢对此thread

的帮助

答案 2 :(得分:0)

我只是用一种非常简单的方法修复了它

您只需从 URI 中删除 file:/ 即可获得文件路径。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 1002){
        if (resultCode == RESULT_OK) {
            // Get the Uri of the selected file
            Uri uri = data.getData();
            String uriString = uri.toString();
            File myFile = new File(uriString);
            String[] pathArr = myFile.getAbsolutePath().split(":/");
            String path = pathArr[pathArr.length - 1];
        } 
    }
}