Я создаю приложение, которое сохраняет записанные 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;
, то это работает. Это создает файл в нужном каталоге, но когда я его удаляю, он все равно появляется в окне реселлера, а также в папке «Музыка» (в эмуляции, а не в папке приложения). Что я должен делать? Заранее спасибо!