Android 默认音调选择器问题(带有通知和警报的默认音调)

Posted

技术标签:

【中文标题】Android 默认音调选择器问题(带有通知和警报的默认音调)【英文标题】:Android Default tone picker issue (default tone with notifications and alarm) 【发布时间】:2014-02-27 18:54:52 【问题描述】:

我不知道这是否是一个容易解决的愚蠢问题。我有一个铃声选择器,它显示默认铃声选项(用于通知)。像这样:

Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
startActivityForResult(intent, RingtoneManager.TYPE_NOTIFICATION);

然后我得到了结果:

protected void onActivityResult(int requestCode, int resultCode, Intent mRingtone) 
    switch (requestCode) 
        case RingtoneManager.TYPE_NOTIFICATION:
            if (resultCode == RESULT_OK) 
                notifToneUri = mRingtone.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
                Ringtone ringtone = RingtoneManager.getRingtone(this, uri);
                Log.d(TAG,"Uri = " + notifToneUri.toString() + " and title = " + ringtone.getTitle(this));
            
        break;
     

发生了一件奇怪的事情,如果我选择“默认通知音”选项,uri 应该是:*content://settings/system/notification_sound* 但 uri 是 content ://settings/system/ringtone(这是铃声的默认值,而不是通知)。默认警报音也会发生同样的情况。

我是这样解决的:

if (notifToneUri.equals(Settings.System.DEFAULT_RINGTONE_URI))
    notifToneUri = Settings.System.DEFAULT_NOTIFICATION_URI;

好的,这行得通...但我想知道是否有更好的方法或者我做错了什么。

提前谢谢你。

【问题讨论】:

【参考方案1】:

我认为您没有正确检索 Uri。下面是一个示例:

启动RingtoneManager

final Intent ringtone = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
ringtone.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
ringtone.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
ringtone.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI,
            RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
startActivityForResult(ringtone, 0);

检索UriActivity.onActivityResult 中的标题

if (requestCode == 0 && resultCode == RESULT_OK) 
    final Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
    final Ringtone ringtone = RingtoneManager.getRingtone(this, uri);
    // Get your title here `ringtone.getTitle(this)`

您可以看到here in the source for Ringtone,仅当Uri 的权限等于Settings.AUTHORITY 而从不MediaStore.AUTHORITY 时才添加前缀。

【讨论】:

对不起,我的错,我没有写完所有的代码。我正在按照您的建议进行操作(用于启动选择器并获取结果)。但我遇到了我描述的问题。如果我在选择器中选择“默认通知音”,而不是收到正确的 uri,我会收到默认 RINGER 音的 uri。 我进行了编辑。您需要将RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI 包含在内。 是的!这就是诀窍,我认为如果您将 TYPE_NOTIFICATION 和 EXTRA_RINGTONE_SHOW_DEFAULT 设置为 true 就足够了,但事实并非如此。非常感谢。

以上是关于Android 默认音调选择器问题(带有通知和警报的默认音调)的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于打盹模式时,警报管理器触发的 Android 通知未触发

MainActivity 中的 Android 类没有收到来自警报管理器的广播

Xamarin 警报管理器 Android

在Android警报管理器中设置时间-立即触发警报[重复]

在特定时间间隔重复警报

应用程序停止时如何在 Android 中获取本地通知?