仿微信新消息提示音

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

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

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

具体实现的步骤。

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

  

  

时间: 2024-10-11 17:31:52

仿微信新消息提示音的相关文章

高仿微信新消息提示音功能

最近公司在做一个项目,有一个切换消息提示音的功能,可以切换本应用收到消息的提示音,而不影响系统提示音.我就按照微信的那个样式进行了编程,最终得到想要的效果. 转载请注明出处,谢谢:http://blog.csdn.net/harryweasley/article/details/46408037 怕有些人不知道怎么进入微信的新消息提示音功能,我这里说下操作步骤: 打开微信----我---设置---新消息提醒---新消息提示音. 经过以上的步骤就进入了这样的界面 这个是微信的效果图. 下面是我自己

iOS 实现角标 新消息提示红点 数字角标

镔哥今天写写实习新消息提示的小圆圈数字角标 直接上代码吧. 1:直接复杂uibarButton类 // //  UIBarButtonItem+Badge.h //  therichest // //  Created by 淘股 on 2015-05-05. //  Copyright (c) 2015 taogu Inc. All rights reserved. // #import <UIKit/UIKit.h> @interface UIBarButtonItem (Badge) @

Android UI设计: 分享一个仿QQ聊天消息提示可以拖拉气泡

首先上效果图 功能有: 1. 可以随时拖拉 2. 拖拉超过一定距离会监听 3. 拖拉返回的时候,有来回反弹效果 此效果先是参照了网上github两个版本的效果.不过都不是自己想要那么理想. 1.其中有一个是两层,一层是textview控件和一层surfaceview.经测试效果不错,但是效率不高,在刚点击的有闪动现象.会跳帧.于是放弃这种方法.不过它能够全屏拖拉. 2另一个的实现方法很赞,全程一个view就完事,全部自绘,没有用控件.而且贝塞尔曲线就是中间那个瘦瘦的,随着距离越来越瘦的,是两条贝

Fragment+FragmentTabHost组件实现常见主页面(仿微信新浪)

采取的方法是Fragment+FragmentTabHost组件来实现这种常见的app主页面的效果 首先给出main.xml文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertica

CSS+jQuery实现可关闭的智能定位的浮动消息提示框

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>CSS+jQuery实现可关闭的智能定位的

原生wcPop.js消息提示框(移动端)、内含仿微信弹窗效果

wcPop.js移动端消息对话框插件是之前的wxPop.js的升级版,优化了js和css,并且新增了仿微信弹窗效果, 是一款含有多种情景模式的原生模态消息对话框代码,可用于替代浏览器默认的alert弹出对话框,它提供各种参数和方法,功能非常强大.目前已经在项目中有应用到xwpop开发实例. 调用js库<script src="js/jquery-2.1.1.min.js"></script><script src="wcPop/wcPop.js&

微信电脑版怎么修改信息提示音

微信电脑版修改信息提示音的方法如下: 1.安装最新版的电脑微信 微信文件安装在 D:/software/weChat文件夹中 2.安装eXeScope软件,这个网上可以找到. 3.电脑微信关闭状态,打开eXeScope.exe文件. 4.打开微信根目录,找到WeChatResource.dll文件 5.用eXeScope打开WeChatResource.dll,并如图找到wave中的118.118就是微信的通知文件. 6.找到我们想要更改的铃声.并重命名为118.wav 7.导入我们新的铃声文件

高仿微信5.2.1主界面架构 包含消息通知

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25708045 一哥们去新疆前给了我个任务,就是整这东西,哥们回来了,赶紧做了个,哈哈,可惜没给我带切糕. 新版微信的效果,一眼看上去准备用ViewpagerIndicator来实现,但是需要在Indicator的后面添加消息通知(BadgeView),可惜没有办法自定义Indicator,最后还是自己写了个实现. 主结构:ViewPager和FragmentPagerAdapt

IOS 新消息通知提示-声音、震动

一.APNS 1.注册 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];复制代码2.服务器推送(JAVA) PushNotificationPayload payLoad =  PushNotificationPayl