欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android仿微信新消息提示音

程序员文章站 2022-06-06 17:27:01
怕有些人不知道怎么进入微信的新消息提示音功能,我这里说下操作步骤: 打开微信----我---设置---新消息提醒---新消息提示音。 经过以上的步骤就进入了这样的界面...

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

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

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

Android仿微信新消息提示音

具体实现的步骤。

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

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