#java #android #android-studio #path #filepath
#java #Android #android-studio #путь #путь к файлу
Вопрос:
Я хочу получить путь к файлу (в данном случае pdf). Я попытался myFile.getAbsolutePath()
, uri.getPath()
но вместо возврата /storage/emulated/0/Download/dummy.pdf
он возвращается /com.android.providers.downloads.documents/document/8
.
Я не смог найти рабочего решения этой проблемы, поэтому вместо этого я использовал FilePath.getPath(context, uri)
.
Он работал отлично, но после нескольких запусков перестал работать и выдал мне исключение: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/msf:31 flg=0x1 }} to activity {com.example.pm/com.example.pm.UploadFileActivity}: java.lang.NumberFormatException: For input string: "msf:31"
И вот почему мне не нравится использовать FilePath .
У кого-нибудь есть идеи, почему в первую очередь я не получаю правильный путь (он работал раньше) и как я могу решить эту проблему? Если нет, есть ли какой-либо другой способ, которым я могу получить путь к файлу, будучи на 100% уверенным, что он всегда работает?
Я был бы признателен за вашу помощь заранее. Спасибо.
Редактировать:
InputStreamRequestBody :
new RequestBodyUtil();
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("name",name)
.addFormDataPart("category",category)
.addFormDataPart("date",date)
.addFormDataPart("time",time)
.addFormDataPart("author", Objects.requireNonNull(LoginActivity.sharedPreferences.getString("id", "")))
.addFormDataPart("file", fileName,
RequestBodyUtil.create(MediaType.parse(mime),is))
.build();
Файловый менеджер :
private void doBrowseFile() {
Intent chooseFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
chooseFileIntent.setType("application/pdf");
// Only return URIs that can be opened with ContentResolver
chooseFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
chooseFileIntent = Intent.createChooser(chooseFileIntent, "Choose a file");
startActivityForResult(chooseFileIntent, UNIQUE_REQUEST_CODE);
}
Результат действия :
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == UNIQUE_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
if (data != null) {
Uri uri = data.getData();
Log.i(LOG_TAG, "Uri: " uri);
assert uri != null;
String uriString = uri.toString();
File myFile = new File(uriString);
String path = myFile.getAbsolutePath();
String displayName;
if (uriString.startsWith("content://")) {
Cursor cursor = null;
try {
cursor = this.getContentResolver().query(uri, null, null, null, null);
if (cursor != null amp;amp; cursor.moveToFirst()) {
displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
Log.d("nameeeee>>>> ", displayName);
}
} finally {
cursor.close();
}
} else if (uriString.startsWith("file://")) {
displayName = myFile.getName();
Log.d("nameeeee>>>> ", displayName);
}
fUri = uri;
tvFilePath.setText(path);
}
}
super.onActivityResult(requestCode, resultCode, data);
}
}
Мне нужен путь к файлу для загрузки данных в базу данных с использованием okhttp :
if(fUri == null){
progressDialog.dismiss();
return;
}
String mime = "application/pdf";
//Log.e(TAG, imageFile.getName() " " mime " " uriToFilename(uri));
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("name",name)
.addFormDataPart("category",category)
.addFormDataPart("date",date)
.addFormDataPart("time",time)
.addFormDataPart("author", Objects.requireNonNull(LoginActivity.sharedPreferences.getString("id", "")))
.addFormDataPart("file", fileName,
RequestBody.create(new File(path), MediaType.parse(mime)))
.build();
Класс FilePath :
/**
* Created by Juned on 1/17/2017.
*/
public class FilePath
{
/**
* 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 amp;amp; 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 amp;amp; 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());
}
Комментарии:
1. Взгляните на uri.toString() . Начните с описания того, как вы получили этот uri. Я не знаю путь к файлу класса. Отправьте код FilePath.getPath() .
2. @blackappa
Uri uri = data.getData(); String uriString = uri.toString(); File myFile = new File(uriString);
в onActivityResult после просмотра файла pdf.3. @blackapps Извините, я не понял, что вы имели в виду. сообщение отредактировано. что вы подразумеваете под
...how you obtained that uri
4.
path of a file in android studio is not in a correct format
Вы имеете в виду:How to upload a file from uri obtained with ACTION_GET_CONTENT with okhttp?
5. Нет, тогда вы сделали что-то не так. И не используйте uri.getPath(). но сам uri или uri.toString() . И откройте InputStream для uri.
InputStream is = getContentResolver().openInputStream(data.getData());