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

}

}

以上是 Android仿微信新消息提示音 的全部内容, 来源链接: utcz.com/z/349861.html

回到顶部