Как исправить «Не удалось найти настроенный корень, содержащий / storage / emulated / 0 / Android / data / - PullRequest
0 голосов
/ 15 октября 2019

Я создаю приложение, которое сохраняет записанные WAV-файлы и сохраняет их в папке приложения в хранилище. Но когда я пробую это, он показывает мне ошибку

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.nik.notetrimmer, PID: 10116
    java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.nik.notetrimmer/files/Music/v.wav
        at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:744)
        at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)
        at com.nik.notetrimmer.AudioTrimmerActivity.afterSavingRecording(AudioTrimmerActivity.java:896)
        at com.nik.notetrimmer.AudioTrimmerActivity.access$3300(AudioTrimmerActivity.java:34)
        at com.nik.notetrimmer.AudioTrimmerActivity$8$1.run(AudioTrimmerActivity.java:869)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Сам код довольно большой, но вот важные части:

Thread mSaveSoundFileThread = new Thread() {
            public void run() {
                String outPath = makeRecordingFilename(txtFileName.getText().toString(), Utility.AUDIO_FORMAT);
                File outFile = new File(outPath);
                try {
                    mRecordedSoundFile.WriteFile(outFile, startFrame, endFrame - startFrame);
                } catch (Exception e) {
                    if (outFile.exists()) {
                        outFile.delete();
                    }
                    e.printStackTrace();
                }

                mProgressDialog.dismiss();

                final String finalOutPath = outPath;
                Runnable runnable = new Runnable() {
                    public void run() {
                        afterSavingRecording(txtFileName.getText().toString(),
                                finalOutPath,
                                duration, finish);
                    }
                };
                mHandler.post(runnable);
            }
        };
        mSaveSoundFileThread.start();

Методы: этот имеет делос именем файла (и путем):

 private String makeRecordingFilename(CharSequence title, String extension) {
            File newFile = new File(getApplicationContext().getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath(), title + extension);
            try {
                RandomAccessFile f = new RandomAccessFile(newFile, "r");
                f.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        return newFile.getAbsolutePath();
    }

Этот имеет дело со Вставкой:

private void afterSavingRecording(CharSequence title,
                                     String outPath,
                                     int duration, int finish) {
        File outFile = new File(outPath);
        long fileSize = outFile.length();

        ContentValues values = new ContentValues();
        values.put(MediaStore.Audio.Media.DATA, outPath);
        values.put(MediaStore.MediaColumns.TITLE, title.toString());
        values.put(MediaStore.MediaColumns.SIZE, fileSize);
        values.put(MediaStore.MediaColumns.MIME_TYPE, Utility.AUDIO_MIME_TYPE);

        values.put(MediaStore.Audio.Media.ARTIST, getApplicationInfo().name);
        values.put(MediaStore.Audio.Media.DURATION, duration);

        values.put(MediaStore.Audio.Media.IS_MUSIC, true);
        Uri uri = FileProvider.getUriForFile(getApplicationContext(), "com.nik.android.fileprovider", outFile);
        final Uri newUri = getContentResolver().insert(uri, values);

        if (finish == 0) {
            loadFromFile(outPath);
        } else if (finish == 1) {
            Bundle conData = new Bundle();
            conData.putString("INTENT_AUDIO_FILE", outPath);
            Intent intent = getIntent();
            intent.putExtras(conData);
            setResult(RESULT_OK, intent);
            finish();
        }
    }

Все, что было в действии, которому я отправляю намерение. В Main у меня есть просмотрщик, который должен собрать файлы и показать их следующим способом:

private void loadRecordings() {
        _recordings.clear();
        Uri uri = Uri.parse(getApplicationContext().getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath());
        String selection = MediaStore.Audio.Media.IS_MUSIC + "!=0";
        Cursor cursor = getContentResolver().query(uri, null, selection, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                do {
                    String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
                    String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));

                    Recording s = new Recording(name, url);
                    _recordings.add(s);

                } while (cursor.moveToNext());
            }
            cursor.close();
            recordingAdapter = new RecordingAdapter(this, _recordings);
        }
    }

Итак, я получаю эту ошибку. Однако, если я изменяю переменные Uri в loadRecordings и afterSavingRecording на

Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 

, то это работает. Это создает файл в нужном каталоге, но когда я его удаляю, он все равно появляется в окне реселлера, а также в папке «Музыка» (в эмуляции, а не в папке приложения). Что я должен делать? Заранее спасибо!

...