Android仿微信新消息提示音
怕有些人不知道怎么進(jìn)入微信的新消息提示音功能,我這里說下操作步驟:
打開微信----我---設(shè)置---新消息提醒---新消息提示音。
經(jīng)過以上的步驟就進(jìn)入了這樣的界面
具體實(shí)現(xiàn)的步驟。
難點(diǎn)之一:獲取到手機(jī)系統(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++) { //獲取當(dāng)前i的鈴聲信息 Ringtone ringtone = manager.getRingtone(i); //獲取當(dāng)前i的uri,設(shè)置notification的自定義鈴聲要用到 Uri uri = manager.getRingtoneUri(i); //獲取到當(dāng)前鈴聲的名字 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) { // 當(dāng)點(diǎn)擊的item是第一個“跟隨系統(tǒng)”時 if (position == 0) { // 得到系統(tǒng)默認(rèn)的消息uri Uri defalutUri = manager .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); // 通過URI獲得系統(tǒng)默認(rèn)的Ringtone發(fā)出聲音 Ringtone defalutRingtone = manager.getRingtone( RingtoneActivity.this, defalutUri); defalutRingtone.play(); ringName = "跟隨系統(tǒng)"; uri = null; } else { // 當(dāng)點(diǎn)擊的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的點(diǎn)擊事件里面,用到了 */ private void initRingtoneManager() { manager = new RingtoneManager(this); manager.setType(RingtoneManager.TYPE_NOTIFICATION); manager.getCursor(); } /** * 得到當(dāng)前鈴聲的行數(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:
因?yàn)閘istView顯示的第一行是一個“追隨系統(tǒng)”的item,所以我在適配數(shù)據(jù)的時候,有些小改變,在i=-1的時候,將ringtoneList添加為“追隨系統(tǒng)”,其他的不變。因?yàn)檫M(jìn)行了這樣的處理,那么在點(diǎn)擊各個item時候,獲得鈴聲并進(jìn)行播放時候,要做這樣的處理:
Ringtone ringtone = manager.getRingtone(position - 1);
解釋2:
最終將選擇的鈴聲uri路徑以String的格式存入到sharedPreference中。
Bitmap btm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); // 這里大圖標(biāo),小圖標(biāo)剛好相反 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 { // 默認(rèn)的系統(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:
當(dāng)點(diǎn)擊保存按鈕后,就進(jìn)入到之前的界面,因?yàn)槲抑暗慕缑媸且粋€viewpager+fragment的一個界面,一個activity里面加入了四個Fragment的這樣的一個界面。進(jìn)入到主activity時候,進(jìn)行判斷:
/** * 選擇消息提示音后,跳轉(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)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
相關(guān)文章
Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動畫效果
在android開發(fā),我們會常常使用到縮放動畫,這篇文章主要給大家介紹了關(guān)于Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動畫效果的相關(guān)資料,需要的朋友可以參考下2021-08-08Android啟動頁用戶相關(guān)政策彈框的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android啟動頁用戶相關(guān)政策彈框的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Android實(shí)現(xiàn)聲音采集回聲與回聲消除
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)聲音采集回聲與回聲消除,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08Android用SharedPreferences實(shí)現(xiàn)登錄注冊注銷功能
這篇文章主要為大家詳細(xì)介紹了Android用SharedPreferences實(shí)現(xiàn)登錄注冊注銷功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04Android 如何獲取手機(jī)總內(nèi)存和可用內(nèi)存等信息
這篇文章主要介紹了Android系統(tǒng)檢測程序內(nèi)存占用各種方法,并對內(nèi)存信息的詳細(xì)介紹,需要的朋友可以參考下2016-07-07Android自定義view實(shí)現(xiàn)日歷打卡簽到
這篇文章主要為大家詳細(xì)介紹了Android自定義view實(shí)現(xiàn)日歷打卡簽到,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05android教程之使用popupwindow創(chuàng)建菜單示例
這篇文章主要介紹了android使用popupwindow創(chuàng)建菜單的示例,需要的朋友可以參考下2014-02-02