FileUriExposedException при отображении уведомления со звуком
Пользователи моего приложения могут выбрать мелодию звонка, которая будет воспроизводиться при получении уведомления в моем приложении.
Я показываю диалог выбора мелодии звонка:
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
startActivityForResult(intent, REQUEST_CODE);
и сохранить результаты:
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
PreferenceManager.getDefaultSharedPreferences(this).edit().putString(RINGTONE_SP_KEY, uri.toString()).apply();
Когда я показываю уведомление, я использую либо мелодию звонка, выбранную пользователем, либо мелодию по умолчанию:
private void showNotification() {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSound(getRingtone());
builder.setContentText("MyContentText");
builder.setSmallIcon(R.drawable.test);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, builder.build());
}
private Uri getRingtone() {
String ringtoneUriFromSp = PreferenceManager.getDefaultSharedPreferences(this).getString(RINGTONE_SP_KEY, null);
if (ringtoneUriFromSp == null) {
return RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
} else {
return Uri.parse(ringtoneUriFromSp);
}
}
Как по умолчанию, так и пользовательские мелодии звонка Uri
обычно выглядит примерно так:
content://media/internal/audio/media/16
и все работает хорошо.
Я получаю (довольно редко) следующее исключение через Crashlytics:
Неустранимое исключение: файл android.os.FileUriExposedException:///storage/emulated/0/MIUI/ringtone/CloudMagic_3.ogg, доступный за пределами приложения через Notification.sound
для некоторых устройств (например, Xiaomi Mi Max 2, Galaxy Tab A 10.1).
Документы об исключениях говорят, что это связано с Uri
подвергается через file:// Uri
(неправильный путь) вместо content:// Uri
(правильный путь), который я не мог воспроизвести ни на одном из моих устройств; как по умолчанию, так и выбранный пользователем рингтон Uri
пройти через content:// Uri
,
Я не знаю, происходит ли это для мелодии звонка по умолчанию, полученной через
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
или мелодию, выбранную пользователем.
Кто-нибудь сталкивался с такой же проблемой или знает, в чем проблема?