Android仿微信新消息提示音
程序员文章站
2022-06-06 17:27:01
怕有些人不知道怎么进入微信的新消息提示音功能,我这里说下操作步骤:
打开微信----我---设置---新消息提醒---新消息提示音。
经过以上的步骤就进入了这样的界面...
怕有些人不知道怎么进入微信的新消息提示音功能,我这里说下操作步骤:
打开微信----我---设置---新消息提醒---新消息提示音。
经过以上的步骤就进入了这样的界面
具体实现的步骤。
难点之一:获取到手机系统的提示音,并将它们显示在一个listview里面。
参考如下代码:
// 获得ringtonemanager对象 ringtonemanager manager = new ringtonemanager(this); // 设置ringtonemanager对象的类型为type_notification,这样只会获取到notification的对应内容 manager.settype(ringtonemanager.type_notification); cursor cursor = manager.getcursor(); int num = cursor.getcount(); log.i("tag", num + "消息音个数"); // 存储消息音名字的arraylist arraylist<string> ringtonelist = new arraylist<string>(); for (int i = 0; i < num; i++) { //获取当前i的铃声信息 ringtone ringtone = manager.getringtone(i); //获取当前i的uri,设置notification的自定义铃声要用到 uri uri = manager.getringtoneuri(i); //获取到当前铃声的名字 string title = ringtone.gettitle(this); ringtonelist.add(title); }
将获取到的消息提示音的名字,加入到arraylist里。
先将主界面的信息贴上来,看一下,我再慢慢解释:
package jz.his.activity; import java.util.arraylist; import jz.his.adapter.ringtoneadapter; import jz.his.jzhis.r; import jz.his.util.sharedpreferenceutil; import android.app.activity; import android.content.intent; import android.database.cursor; import android.media.ringtone; import android.media.ringtonemanager; import android.net.uri; import android.os.bundle; import android.util.log; import android.view.view; import android.view.window; import android.widget.adapterview; import android.widget.adapterview.onitemclicklistener; import android.widget.listview; public class ringtoneactivity extends activity { arraylist<string> ringtonelist; listview listview; ringtonemanager manager; ringtoneadapter adapter; string ringname = ""; /** * 选择铃声的uri */ uri uri = null; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.activity_ringtone); listview = (listview) findviewbyid(r.id.ringtone); getringtone(); // initringtonemanager(); // ringtonelist = functionactivity.ringtonelist; adapter = new ringtoneadapter(this, ringtonelist, getindex()); listview.setadapter(adapter); // 设置从第getindex()行开始显示 listview.setselection(getindex()); listview.setonitemclicklistener(new onitemclicklistener() { @suppresswarnings("static-access") @override public void onitemclick(adapterview<?> parent, view view, int position, long id) { // 当点击的item是第一个“跟随系统”时 if (position == 0) { // 得到系统默认的消息uri uri defaluturi = manager .getdefaulturi(ringtonemanager.type_notification); // 通过uri获得系统默认的ringtone发出声音 ringtone defalutringtone = manager.getringtone( ringtoneactivity.this, defaluturi); defalutringtone.play(); ringname = "跟随系统"; uri = null; } else { // 当点击的item不是第一个“跟随系统”时,获得的铃声要减一才对 ringtone ringtone = manager.getringtone(position - 1); uri = manager.getringtoneuri(position - 1); ringtone.play(); ringname = ringtone.gettitle(ringtoneactivity.this); } adapter.first = new int[ringtonelist.size()]; if (adapter.first[position] == 0) { adapter.first[position] = 1; } else { adapter.first[position] = 0; } adapter.notifydatasetchanged(); } }); } /** * 初始化ringtonemanager对象,在listview的点击事件里面,用到了 */ private void initringtonemanager() { manager = new ringtonemanager(this); manager.settype(ringtonemanager.type_notification); manager.getcursor(); } /** * 得到当前铃声的行数 */ private int getindex() { for (int i = 0; i < ringtonelist.size(); i++) { if (sharedpreferenceutil.getstring(ringtoneactivity.this, sharedpreferenceutil.ringtone_name).equals( ringtonelist.get(i))) { return i; } } return 0; } /** * 得到ringtone中的所有消息声音 */ private void getringtone() { manager = new ringtonemanager(this); manager.settype(ringtonemanager.type_notification); cursor cursor = manager.getcursor(); int num = cursor.getcount(); log.i("tag", num + "消息音个数"); ringtonelist = new arraylist<string>(); for (int i = -1; i < num; i++) { if (i == -1) { ringtonelist.add("跟随系统"); } else { ringtone ringtone = manager.getringtone(i); // uri uri = manager.getringtoneuri(i); string title = ringtone.gettitle(this); ringtonelist.add(title); } } } public void allclick(view v) { switch (v.getid()) { case r.id.back_button: finish(); break; case r.id.save: if (ringname == "") { // 没有改动铃声直接关闭界面 finish(); } else { // 已经改动uri,如果又选择了跟随系统,则uri为null,其他的就是uri本身 if (uri == null) { sharedpreferenceutil.setstring(ringtoneactivity.this, sharedpreferenceutil.url_string, ""); } else { sharedpreferenceutil.setstring(ringtoneactivity.this, sharedpreferenceutil.url_string, uri.tostring()); } intent intent = new intent(); intent.putextra("ringname", ringname); intent.setclass(ringtoneactivity.this, functionactivity.class); startactivity(intent); } default: break; } } }
解释1:
因为listview显示的第一行是一个“追随系统”的item,所以我在适配数据的时候,有些小改变,在i=-1的时候,将ringtonelist添加为“追随系统”,其他的不变。因为进行了这样的处理,那么在点击各个item时候,获得铃声并进行播放时候,要做这样的处理:
ringtone ringtone = manager.getringtone(position - 1);
解释2:
最终将选择的铃声uri路径以string的格式存入到sharedpreference中。
bitmap btm = bitmapfactory.decoderesource(getresources(), r.drawable.ic_launcher); // 这里大图标,小图标刚好相反 notificationcompat.builder builder = new notificationcompat.builder( this).setsmallicon(r.drawable.ic_launcher) .setcontenttitle(title).setcontenttext(content) .setticker(tickertext); if (sharedpreferenceutil .getboolean(this, sharedpreferenceutil.is_sound)) { } else { // 如果消息声音开启 if (!sharedpreferenceutil.getstringnull(onlineservice.this, sharedpreferenceutil.url_string).equals("")) { // 如果选择了其他的系统声音 builder.setsound(uri.parse(sharedpreferenceutil.getstring( onlineservice.this, sharedpreferenceutil.url_string))); } else { // 默认的系统声音 builder.setdefaults(notification.default_sound); } } if (sharedpreferenceutil.getboolean(this, sharedpreferenceutil.is_vibrate)) { } else { builder.setdefaults(notification.default_vibrate); } // 构建一个intent intent intent = new intent(this, functionactivity.class); intent.putextra("messagedata","messagedata" ); senddata(); // 封装一个intent pendingintent pendingintent = pendingintent.getactivity(this, 0, intent, pendingintent.flag_one_shot); // 设置通知主题的意图 builder.setcontentintent(pendingintent); // 获取通知管理器对象 notificationmanager notificationmanager = (notificationmanager) getsystemservice(context.notification_service); notificationmanager.notify(id, builder.build());
注意:如果是要选择其他的声音,直接是n.sound = 其他声音的uri
这个真的非常重要,就直接这样就可以了,看网上一大堆什么
notification.sound = uri.withappendedpath(audio.media.internal_content_uri, "6"); //使用系统提供的铃音
解释3:
当点击保存按钮后,就进入到之前的界面,因为我之前的界面是一个viewpager+fragment的一个界面,一个activity里面加入了四个fragment的这样的一个界面。进入到主activity时候,进行判断:
/** * 选择消息提示音后,跳转到功能界面后,直接将其跳转设置界面 */ private void selectringtone() { string ringname = getintent().getstringextra("ringname"); log.e("tag", ringname+"传过来的值"); if (ringname != null) { pager.setcurrentitem(2); } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!