仿微信新消息提示音

来源:http://www.cnblogs.com/ganchuanpu/archive/2017/04/17/6724875.html
-Advertisement-
Play Games

怕有些人不知道怎麼進入微信的新消息提示音功能,我這裡說下操作步驟: 打開微信 我 設置 新消息提醒 新消息提示音。 經過以上的步驟就進入了這樣的界面 具體實現的步驟。 難點之一:獲取到手機系統的提示音,並將它們顯示在一個listview裡面。 參考如下代碼: 將獲取到的消息提示音的名字,加入到arr ...


怕有些人不知道怎麼進入微信的新消息提示音功能,我這裡說下操作步驟:

打開微信----我---設置---新消息提醒---新消息提示音。

經過以上的步驟就進入了這樣的界面

具體實現的步驟。

難點之一:獲取到手機系統的提示音,並將它們顯示在一個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  

  

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.前臺javascript 1.在提交的js中這樣寫 document.form1.username.value=encode64(document.form1.username.value); document.form1.password.value=encode64(document.for... ...
  • 引子:用javascript給元素綁定事件,我們可以用addEventListener這個方法,然而這個方法有相容問題,比如在IE瀏覽器上面就無效,在IE上面要用attachEvent這個方法 一、addEventListener和attachEvent的區別: 1、addEventListener ...
  • git:https://github.com/reg21st/vue2 management platform 訪問:https://reg21st.github.io/vue2 management platform 概述: 最近學習vue2.0和elementUI的使用,在各種文檔的幫助下,嘗試 ...
  • 語句 (建議)每條語句放在不同的行上並加上分號 first cnblogs;second cnblogs; 註釋 (建議)用"//" 來註釋單行,用"/*"註釋多行 //有註釋是好事 /*有註釋是好事 有註釋是好事 有註釋是好事 有註釋是好事*/ 變數 JS語法不允許變數名中包含空格或標點符號(美元 ...
  • 本文也同步發表在我的公眾號“我的天空” 上一期我們已經介紹了閉包,由於閉包可以延長函數內部的變數的生存周期,因此我們可以將不需要暴露在全局的變數封裝成函數的內部變數,從而避免代碼污染。 譬如要實現一個簡單的累加器,為了保存每次累加的結果,因此聲明瞭一個全局變數total,代碼如下: var tota ...
  • 文字溢出隱藏 如果你觀察過浮動元素,你會發現這樣一個事實,當前一個元素將寬度占滿以後,後一個元素就會往下掉,如下所示 代碼如下 也許在你眼裡這是個再正常不過的現象,不過有人卻將這個現象用在了實現文本溢出隱藏上,我們來看看他們是怎麼實現的。 先來看看它的效果,如下 實現這個效果的原理就是先將省略號通過 ...
  • 一、進程 進程可以理解為一個應用程式;比如說打開 QQ,那麼在記憶體中就會為 QQ 分配一塊進程;打開微信,那麼在記憶體中就會為 微信 分配一塊進程;並且進程之間是相互獨立的 二、線程 1. 基本概念 線程是進程的基本單元(可以理解為一個進程中的各個操作);比如說 QQ,其中的很多操作,比如說發送文件, ...
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController @end RootViewController.m #import "R ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...