当前位置: 移动技术网 > IT编程>移动开发>Android > Android仿微信新消息提示音

Android仿微信新消息提示音

2019年07月24日  | 移动技术网IT编程  | 我要评论

未来花园bt,星际魔族,胥力文微博

怕有些人不知道怎么进入微信的新消息提示音功能,我这里说下操作步骤:

打开微信----我---设置---新消息提醒---新消息提示音。

经过以上的步骤就进入了这样的界面

具体实现的步骤。

难点之一:获取到手机系统的提示音,并将它们显示在一个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); 
  } 
 } 

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持移动技术网!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网