Android仿微信新消息提示音
怕有些人不知道怎么進入微信的新消息提示音功能,我這里說下操作步驟:
打開微信----我---設(shè)置---新消息提醒---新消息提示音。
經(jīng)過以上的步驟就進入了這樣的界面

具體實現(xiàn)的步驟。
難點之一:獲取到手機系統(tǒng)的提示音,并將它們顯示在一個listview里面。
參考如下代碼:
// 獲得RingtoneManager對象
RingtoneManager manager = new RingtoneManager(this);
// 設(shè)置RingtoneManager對象的類型為TYPE_NOTIFICATION,這樣只會獲取到notification的對應(yīng)內(nèi)容
manager.setType(RingtoneManager.TYPE_NOTIFICATION);
Cursor cursor = manager.getCursor();
int num = cursor.getCount();
Log.i("tag", num + "消息音個數(shù)");
// 存儲消息音名字的arrayList
ArrayList<String> ringtoneList = new ArrayList<String>();
for (int i = 0; i < num; i++) {
//獲取當前i的鈴聲信息
Ringtone ringtone = manager.getRingtone(i);
//獲取當前i的uri,設(shè)置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);
// 設(shè)置從第getIndex()行開始顯示
listView.setSelection(getIndex());
listView.setOnItemClickListener(new OnItemClickListener() {
@SuppressWarnings("static-access")
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// 當點擊的item是第一個“跟隨系統(tǒng)”時
if (position == 0) {
// 得到系統(tǒng)默認的消息uri
Uri defalutUri = manager
.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
// 通過URI獲得系統(tǒng)默認的Ringtone發(fā)出聲音
Ringtone defalutRingtone = manager.getRingtone(
RingtoneActivity.this, defalutUri);
defalutRingtone.play();
ringName = "跟隨系統(tǒng)";
uri = null;
} else {
// 當點擊的item不是第一個“跟隨系統(tǒng)”時,獲得的鈴聲要減一才對
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();
}
/**
* 得到當前鈴聲的行數(shù)
*/
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 + "消息音個數(shù)");
ringtoneList = new ArrayList<String>();
for (int i = -1; i < num; i++) {
if (i == -1) {
ringtoneList.add("跟隨系統(tǒng)");
} 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 == "") {
// 沒有改動鈴聲直接關(guān)閉界面
finish();
} else {
// 已經(jīng)改動uri,如果又選擇了跟隨系統(tǒng),則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顯示的第一行是一個“追隨系統(tǒng)”的item,所以我在適配數(shù)據(jù)的時候,有些小改變,在i=-1的時候,將ringtoneList添加為“追隨系統(tǒng)”,其他的不變。因為進行了這樣的處理,那么在點擊各個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("")) {
// 如果選擇了其他的系統(tǒng)聲音
builder.setSound(Uri.parse(SharedPreferenceUtil.getString(
OnlineService.this, SharedPreferenceUtil.url_string)));
} else {
// 默認的系統(tǒng)聲音
builder.setDefaults(Notification.DEFAULT_SOUND);
}
}
if (SharedPreferenceUtil.getBoolean(this,
SharedPreferenceUtil.IS_VIBRATE)) {
} else {
builder.setDefaults(Notification.DEFAULT_VIBRATE);
}
// 構(gòu)建一個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);
// 設(shè)置通知主題的意圖
builder.setContentIntent(pendingIntent);
// 獲取通知管理器對象
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(id, builder.build());
注意:如果是要選擇其他的聲音,直接是n.sound = 其他聲音的Uri
這個真的非常重要,就直接這樣就可以了,看網(wǎng)上一大堆什么
notification.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6"); //使用系統(tǒng)提供的鈴音
解釋3:
當點擊保存按鈕后,就進入到之前的界面,因為我之前的界面是一個viewpager+fragment的一個界面,一個activity里面加入了四個Fragment的這樣的一個界面。進入到主activity時候,進行判斷:
/**
* 選擇消息提示音后,跳轉(zhuǎn)到功能界面后,直接將其跳轉(zhuǎn)設(shè)置界面
*/
private void selectRingtone() {
String ringName = getIntent().getStringExtra("ringName");
Log.e("tag", ringName+"傳過來的值");
if (ringName != null) {
pager.setCurrentItem(2);
}
}
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
Android啟動頁用戶相關(guān)政策彈框的實現(xiàn)代碼
這篇文章主要介紹了Android啟動頁用戶相關(guān)政策彈框的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
Android用SharedPreferences實現(xiàn)登錄注冊注銷功能
這篇文章主要為大家詳細介紹了Android用SharedPreferences實現(xiàn)登錄注冊注銷功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04
Android 如何獲取手機總內(nèi)存和可用內(nèi)存等信息
這篇文章主要介紹了Android系統(tǒng)檢測程序內(nèi)存占用各種方法,并對內(nèi)存信息的詳細介紹,需要的朋友可以參考下2016-07-07
android教程之使用popupwindow創(chuàng)建菜單示例
這篇文章主要介紹了android使用popupwindow創(chuàng)建菜單的示例,需要的朋友可以參考下2014-02-02

