путь к файлу в Android Studio указан в неправильном формате

#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());