Ошибка при получении пути к файлу в Android 11

когда я получаю путь к файлу в Android 11.

protected File getOutputMediaFile() {
    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date());
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, timeStamp + ".jpg");
    fileUri = getActivity().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
    Log.e("File Uri Path", "Uri inserted into media store = " + fileUri);
   Toast.makeText(getActivity(), "File uri = "+fileUri, Toast.LENGTH_LONG).show();
    String path = getImageRealPathFromURI(fileUri);
    File file = new File(path);
    return file;
}

private String getImageRealPathFromURI(Uri contentUri) {
    String realPath = "";
    Cursor cursor = null;
    try {
        String[] proj = {MediaStore.Images.Media.DATA};
        cursor = getActivity().getContentResolver().query(contentUri, proj, null, null, null);
        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            realPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
        } else {
            Log.e("Image Real Path", "Cursor count appearing to be zero");
            Toast.makeText(getActivity(), "Cursor count appearing to be zero", Toast.LENGTH_LONG).show();
            realPath = "";
        }
    } catch (Exception e) {
        Log.e("Image Real Path", "Exception fetching getImageRealPathFromURI() due to " + e.toString());
       Toast.makeText(getActivity(),"Exception fetching getImageRealPathFromURI() due to "+e.toString(), Toast.LENGTH_LONG).show();
        realPath = "";
    } finally {
        cursor.close();
    }
    return realPath;
}

Я встречаю ошибку: /storage/emulated/0/Pictures/1614237849822.jpg: ошибка открытия: EEXIST (файл существует). на libcore.io.IoBridge.open(IoBridge.java:492). Когда я получаюOutputMediaFile().getpath. Кто-нибудь поможет мне?


person Mr Robin    schedule 25.02.2021    source источник
comment
I meet error : /storage/emulated/0/Pictures/1614237849822.jpg: open failed: Нет кода, который пытается открыть файл.   -  person blackapps    schedule 25.02.2021
comment
Используйте file.exists(), прежде чем пытаться что-то с ним сделать.   -  person blackapps    schedule 25.02.2021
comment
Удалить getImageRealPathFromURI(). Это не будет надежным, и у вас все равно мало возможностей для использования пути на Android 11+.   -  person CommonsWare    schedule 25.02.2021


Ответы (2)


добавьте эту строку в файл манифеста:

android:requestLegacyExternalStorage="true"

и убедитесь, что вы добавили разрешение на чтение внешнего хранилища, а также разрешили это разрешение

person Muhammad Asad    schedule 25.02.2021
comment
Это работает только для устройств Android 10. - person blackapps; 25.02.2021
comment
Это не работает в Android 11 - person Information Tech support; 22.06.2021

getContentResolver().insert() даст вам хороший свежий uri для записи содержимого файла.

Это дает uri, который вы можете использовать. Он не создает файл для вас.

Даже если вы получите путь к еще не существующему файлу со столбцом .DATA, этот файл еще не существует.

Вы можете просто проверить это с помощью File.exists().

Только если вы откроете OutputStream для полученного uri и напишете в него, файл будет создан.

Используйте Ури! Для чего вам нужен этот путь данных?

person blackapps    schedule 25.02.2021
comment
Я хочу установитьOutputFile в mediaRecorder. в Android 11 я создаю несуществующий файл, но получаю эту ошибку. - person Harish Vats; 07.06.2021