android - 更改android中的通知铃声

标签 android notifications ringtone

我自己实现了 preference screen 即,我准备了 custom listview 并自行管理我的应用程序所需的所有内容。但是我不知道如何为用户提供更改通知铃声的工具。通常我们可以通过RingtonePreferece来实现。

但是如何在不使用首选项屏幕的情况下实现它,以便通过单击该列表项将用户重定向到铃声列表,当他选择该特定铃声时,铃声的标题应显示在该特定列表中行,必须用作通知铃声。有人可以建议如何实现这一目标吗?下面是我的通知代码。

NotificationCompat.Builder builder =  
                new NotificationCompat.Builder(context)  
                .setSmallIcon(R.drawable.ic_launcher)
                .setTicker(msg)
                .setContentTitle(title)  
                .setContentText(msg)
                .setWhen(System.currentTimeMillis())
                .setAutoCancel(true);
NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);  
         manager.notify(id, builder.build());

最佳答案

好的,第一步是让用户选择他想要的铃声。我将帮助您实现一个列出可用铃声并允许用户选择一个的 Activity 。当然,这个 Activity 是一个 ListActivity。

首先为铃声创建一个容器。我将其命名为 RingtoneObject,它包含铃声的名称以及铃声的 uri:

private static final class RingtoneObject {
    private String name;
    private Uri uri;
    public RingtoneObject(String name, Uri uri) {
        this.name = name;
        this.uri = uri;
    }
    @Override
    public String toString() {
        return name==null?"":name.toString();
    }

}

在 onCreate 中,您应该向 RingtoneManager 查询可用的铃声,然后遍历它们并将它们添加到 RingtoneObject 类型的列表中。代码很简单:

ArrayAdapter<RingtoneObject> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    RingtoneManager ringtoneMgr = new RingtoneManager(this);
    ringtoneMgr.setType(RingtoneManager.TYPE_ALARM);
    Cursor alarmsCursor = ringtoneMgr.getCursor();
    int alarmsCount = alarmsCursor.getCount();
    RingtoneObject[] alarms = new RingtoneObject[alarmsCount];
    int index = 0;
    while(alarmsCursor.moveToNext()) {
        alarms[index] = new RingtoneObject(ringtoneMgr.getRingtone(index).getTitle(this), ringtoneMgr.getRingtoneUri(index));
        index++;
    }
    alarmsCursor.close();
    adapter = new ArrayAdapter<MainActivity.RingtoneObject>(this, android.R.layout.simple_list_item_1, alarms);
    setListAdapter(adapter);
    getListView().setOnItemClickListener(this);
}

您会注意到适配器的范围超出了 onCreate 函数。我需要在 OnItemClickListener 的回调中引用它。您还可以注意到,我将 ListView 的 OnItemClickListener 设置为 this,在此上下文中,它是 Activity 本身。因此,该 Activity 应实现 OnItemClickListener 并且在单击某个项目时:我只是播放了铃声。

MediaPlayer md;
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
    if(md != null) {
        if(md.isPlaying())
            md.stop();
        md = null;
    }
    md = MediaPlayer.create(this, adapter.getItem(position).uri);
    md.start();
}

同样,MediaPlayer 不可用,因为每当我想停止播放时我都需要引用。

无论如何,在您自己的 onItemClick 函数或您为用户提供的某种其他类型的选择铃声的机制中,您必须将铃声的 Uri 保存在一些持久性存储(例如 SharedPreferences)中,然后当您想要显示通知,使用保存的 uri。

注意:您可以使用 theUri.toString() 将 uri 保存为字符串,然后加载此字符串并使用 Uri.parse(theString) 将其转换回 Uri >.

Here is the complete sample (for uri selection).

关于android - 更改android中的通知铃声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18683608/

相关文章:

ios - Xamarin iOS自定义通知声音

android - 通知自定义声音在前台播放但在后台应用程序时不播放

Android 设置铃声仅在第一次时有效

android - 我们如何从自定义适配器调用 onBackPressed() 函数

java - ANDROID:在 Java 中访问 CIFS 共享

javascript - 单击通知打开已安装的 PWA

android - 以编程方式为应用程序设置自定义通知铃声(从移动设备中的音频文件中选择)

audio - 如何在flutter中播放默认铃声?

java - 如何以编程方式设置具有透明背景颜色的按钮的不透明度

android - ParseFacebookUtils [V4-1.9.1] logInWithReadPermissionsInBackground 无效日期