我的应用的用户可以选择在我的应用中收到通知时应播放的铃声。
我会显示一个铃声选择对话框:
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 file:///storage/emulated/0/MIUI/ringtone/CloudMagic_3.ogg暴露 超越app通过Notification.sound
对于某些设备(例如,小米Mi Max 2,Galaxy Tab A 10.1)。
exception docs说这源于Uri
通过file:// Uri
(错误的方式)而不是content:// Uri
(正确的方式)曝光,我无法在任何地方重现我的设备;默认设置以及用户选择的铃声Uri
均来自content:// Uri
。
我不知道通过
获取的默认铃声是否会发生这种情况RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
或用户选择的铃声。
有没有人遇到过同样的问题或者知道问题可能在这里?