显示声音通知

时间:2017-10-17 11:04:44

标签: android android-notifications android-file

我的应用的用户可以选择在我的应用中收到通知时应播放的铃声。

我会显示一个铃声选择对话框:

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

或用户选择的铃声。

有没有人遇到过同样的问题或者知道问题可能在这里?

0 个答案:

没有答案