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);
  }
 } 

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

(0)

相关推荐

  • Android震动与提示音实现代码

    本文实例为大家分享了android消息提示的具体代码,供大家参考,具体内容如下 protected AudioManager audioManager; protected Vibrator vibrator; audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); //此方法是由Context调用的 vibrator = (Vibrator)getSystemService(Context.VIBRATOR_S

  • Android 实现电话拦截及拦截提示音功能的开发

    本文所讲的内容是在Android系统中如何写程序进行电话拦截,并发出拦截提示音提醒用户,可以说此功能还是比较实用的.        1.电话拦截 这个功能大家可能都知道了,就是利用反射原理调用ITelephony的隐藏方法来实现.        2.拦截后提示忙音/空号/已关机/已停机 这个功能其实是要用到MMI指令,具体如何设置呼叫转移的指定可以参考这里 http://baike.baidu.com/view/206402.html?fromTaglist. 在本文中我们会用到"遇忙转移&qu

  • android开发之蜂鸣提示音和震动提示的实现原理与参考代码

    最近在读zxing项目,学到了不少东西.推荐大家也读读.里面有个BeepManager类,实现一个蜂鸣音和震动的实现.我们一起来看看他是怎么做的: 蜂鸣 1.准备一个 音频文件 比如:beep.ogg. ogg格式是声音压缩格式的一种,类似mp3这样.我们准备播放它,就产生了蜂鸣的效果. 2.为activity注册的默认 音频通道 . activity.setVolumeControlStream(AudioManager.STREAM_MUSIC); 这里声明为 STREAM_MUSIC的通道

  • Android仿微信新消息提示音

    怕有些人不知道怎么进入微信的新消息提示音功能,我这里说下操作步骤: 打开微信----我---设置---新消息提醒---新消息提示音. 经过以上的步骤就进入了这样的界面 具体实现的步骤. 难点之一:获取到手机系统的提示音,并将它们显示在一个listview里面. 参考如下代码: // 获得RingtoneManager对象 RingtoneManager manager = new RingtoneManager(this); // 设置RingtoneManager对象的类型为TYPE_NOTI

  • Android仿微信语音消息的录制和播放功能

    一.简述 效果: 实现功能: 长按Button时改变Button显示文字,弹出Dialog(动态更新音量),动态生成录音文件,开始录音: 监听手指动作,规定区域.录音状态下手指划出规定区域取消录音,删除生成的录音文件: 监听手指动作.当手指抬起时,判断是否开始录音,录音时长是否过短,符合条件则提示录音时长过短:正常结束时通过回调返回该次录音的文件路径和时长. 4.点击录音列表的item时,播放动画,播放对应的音频文件. 主要用到4个核心类: 自定义录音按钮(AudioRecordButton):

  • Android仿微信底部菜单栏功能显示未读消息数量

    底部菜单栏很重要,我看了一下很多应用软件都是用了底部菜单栏,这里使用了tabhost做了一种通用的(就是可以像微信那样显示未读消息数量的,虽然之前也做过但是layout下的xml写的太臃肿,这里去掉了很多不必要的层,个人看起来还是不错的,所以贴出来方便以后使用). 先看一下做出来之后的效果: 以后使用的时候就可以换成自己项目的图片和字体了,主框架不用变哈哈, 首先是要布局layout下xml文件 main.xml: <?xml version="1.0" encoding=&qu

  • Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用onTouchListener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private MediaPlayer mPlayer = null; private MediaRecorder mRecorder = null; //语音文件保存路径 private String FileName = null; FileName = Environment.getExternalStorageDirectory().getAbs

  • Android仿微信主界面的实现方法

    本文实例为大家分享了Android模仿微信主界面展示的具体代码,供大家参考,具体内容如下 先看一下效果图 实现的原理: ViewPager+FragmentPagerAdapter 主界面可分为三部分: top标题栏就是一个TextView 中间的ViewPager作为显示的容器,填充Fragment bottom是一个RadioGroup 这里为了布局的优化,将top和bottom抽取出来 ,然后用include将其导入主布局,如下 <LinearLayout xmlns:android=&quo

  • Android使用Toast显示消息提示框

    在前面的实例中,已经应用过Toast类来显示一个简单的提示框了.这次将对Toast进行详细介绍.Toast类用于在屏幕中显示一个消息提示框,该消息提示框没有任何控制按钮,并且不会获得焦点,经过一段时间后自动消失.通常用于显示一些快速提示信息,应用范围非常广泛. 使用Toast来显示消息提示框非常简单,只需要一下三个步骤: (1).创建一个Toast对象.通常有两种方法:一种是使用构造方式进行创建: Toast toast=new Toast(this); 另一种是调用Toast类的makeTex

  • Android仿微信语音对讲录音功能

    自微信出现以来取得了很好的成绩,语音对讲的实现更加方便了人与人之间的交流.今天来实践一下微信的语音对讲的录音实现,这个也比较容易实现.在此,我将该按钮封装成为一个控件,并通过策略模式的方式实现录音和界面的解耦合,以方便我们在实际情况中对录音方法的不同需求(例如想要实现wav格式的编码时我们也就不能再使用MediaRecorder,而只能使用AudioRecord进行处理). 效果图: 实现思路: 1.在微信中我们可以看到实现语音对讲的是通过点按按钮来完成的,因此在这里我选择重新自己的控件使其继承

  • android 仿微信demo——登录功能实现(移动端)

    移动端登录功能实现 登录功能基本和注册一样,唯一不同的是登录可以实现两种登录方式(微信号和手机号),也就是布局不一样.所以需要两个布局,两个activity(这个方法比较简单粗暴,我懒.也可以通过activity动态切换布局,这样只需要一个activity就可以了) 创建两个activity,实现两种登录方式 微信号登录activity LoginUser.java package com.example.wxchatdemo; import android.annotation.Suppres

  • Android仿微信5实现滑动导航条

    本文实例为大家分享了Android 仿微信5滑动导航效果,供大家参考,具体内容如下 ViewPageAdapter.java package com.rong; import java.util.ArrayList; import java.util.List; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.View; publi

  • Android仿微信二维码和条形码

    本文实例为大家分享了Android仿微信二维码和条形码的具体代码,供大家参考,具体内容如下 package your.QRCode.namespace; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHi

随机推荐