仿微信新消息提示音

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仿微信新消息提示音相关的知识,希望对你有一定的参考价值。

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

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

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

技术分享

具体实现的步骤。

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

  

  

  

参考:http://blog.csdn.net/harryweasley/article/details/46408037  

  

  

以上是关于仿微信新消息提示音的主要内容,如果未能解决你的问题,请参考以下文章

Android kotlin 内外部存储根目录及测试(可以实现仿微信未读消息数提示数字)

微信来消息的提示音,怎么更改成自定义的?就是自己喜欢的铃声!

android 仿微信demo————微信消息界面实现(服务端)

android 仿微信demo————微信消息界面实现(服务端)

android 仿微信demo————微信消息界面实现(移动端)

android 仿微信demo————微信消息界面实现(移动端)