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

или мелодию, выбранную пользователем.

Кто-нибудь сталкивался с такой же проблемой или знает, в чем проблема?

0 ответов

Другие вопросы по тегам