2017-06-01 274 views
-1

我使用此代碼成功獲取了視頻文件的實際地址。如何在android中獲取pdf文件的實際文件路徑?

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。

使用下面提到的代碼給了我「的內容://com.android.providers.media.documents/.....」作爲路徑

其實我上傳使用改造2至服務器的PDF文件。 當我硬編碼文件管理器中顯示的地址到mediapath1我能夠成功上傳文件。

我發現了許多從uri獲取地址的解決方案,但沒有人給我正確的地址。

在此先感謝。

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

,我發現實際問題,同時上傳PDF文件到服務器,所以我更新的問題。我無法獲得PDF文件的真實文件地址。 – TheDominus

回答

1

花了幾個小時後,我終於得到了答案。

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` 
}