Android設定鈴聲分析

2021-09-02 10:10:49 字數 3499 閱讀 5711

**其實沒有幾行,這裡簡單記錄下學習的過程.

android系統啟動時會掃瞄系統與sd卡中的對**檔案,分別存入資料庫sqlite中,以contentprovider的形式對外提供服務

路徑:/data/data/com.android.providers.media/databases/***...

可以看到有2個db檔案, 乙個是系統的,乙個是sd卡里的

用sqlite expert開啟internal.db,部分截圖如下:

而這裡面有想說下這四個字段

含義在原始碼裡都有說明,看了一遍資料,發現這四個字段同時有且僅有乙個欄位為1,也就是對於乙個多**檔案只能是這四種中的一種,預設為0,如果是某種型別,則android系統預設置為1,所以也就明白了為什麼很多掃瞄系統通知或者來電鈴聲的示例**中,都會有乙個類似的條件語句:is_notification = 1.

如:

/**

* 掃瞄系統內部通知鈴聲

*/private void scannermediafile() , "is_notification != ?",

new string , "_id asc");

if (cursor == null)

while (cursor.movetonext())

}

這裡 is_notification != 0,效果是一樣的,除非哪天google再定義個2, 3 ......

上面扯了些其他的,關於設定鈴聲的方法,系統提供了乙個鈴聲管理器android.provider.ringtonemanager,其中提供了獲取與設定鈴聲的api

如:uri uri = ringtonemanager.getactualdefaultringtoneuri(mediaactivity.this, ringtonemanager.type_notification);可以獲取到當前系統的通知鈴聲uri

第二個引數可以指定獲取的鈴聲型別,還有其他的type_ringtone,type_alarm,type_all

設定鈴聲的api:

ringtonemanager.setactualdefaultringtoneuri(mediaactivity.this

, ringtonemanager.type_notification, uri.parse(data.get(position)));

第二個引數同上,最後乙個是指定乙個新的uri, 這裡的data.get(position)就是在上面的掃瞄**掃瞄出的所有通知鈴聲path路徑中選澤乙個,然後在解析成乙個uri物件傳入即可

那麼android是如何獲取指定型別的系統鈴聲呢?

這涉及到另乙個類android.provider.settings

相關原始碼如下:

public static uri getactualdefaultringtoneuri(context context, int type)

public synchronized static string getstring(contentresolver resolver, string name) 

//如果不在那個涉及系統安全的設定集合中,則呼叫settings中定義的乙個快取類namevaluecache中的getstring(...)

if (snamevaluecache == null)

return snamevaluecache.getstring(resolver, name);

}

//namevaluecache中getstring()方法部分**

cursor c = null;

try , null);

if (c == null)

string value = c.movetonext() ? c.getstring(0) : null;

synchronized (this)

settings.db結構如下:

上面示例中指定的type_notification的資料如下(藍色部分):

最後返回的就是file:///..........這個string資料,再轉化成uri返回給呼叫者

ok,那麼設定鈴聲的api, setac.......執行的過程也類似:

public static boolean putstring(contentresolver resolver, string name, string value) 

//這裡執行的是另乙個靜態內部類namevaluetable中的方法

return putstring(resolver, content_uri, name, value);

}

protected static boolean putstring(contentresolver resolver, uri uri,

string name, string value) catch (sqlexception e)

}

最後總結下,從整個過程可以看到android系統的一些設計思想

1,設定鈴聲之前,要先知道有哪些系統鈴聲,所以需要掃瞄,android提供了***.media這個contentprovider為此服務,對應的資料庫為internal.db/external-xx.db

2,拿到鈴聲,真正需要設定的時候,提供了setting類管理這個過程,其對應的資料庫為settings.db

2.1 首先檢查是否涉及到系統的一些安全設定引數,這裡定義了secure類來管理,如果涉及到系統安全,那麼又分為兩種情況:

2.1.1如果是查詢,則操作secure 表查詢

2.1.2 如果是寫操作,則直接return

2.2 不涉及到系統安全,就屬於正常設定,接著定義了system類管理

3,查詢操作的實際操作類namevaluecache, 其中定義了

快取name/value鍵值對的集合,避免每次操作都去運算元據庫

可以由呼叫者指定的uri,便於根據uri決定去操作哪張表

以及寫操作的namevaluetable類,因為寫操作涉及到id, 所以繼承了basecolumns類

Android 設定鈴聲

最主要的 ringtonemanager.setactualdefaultringtoneuri this,ringtonemanager.type ringtone,newuri 第乙個引數表示上下文 第二個引數表示設定的鈴聲狀態,第三個表示當前的歌曲uri。如果傳進來的歌曲路徑不存在,則直接呼叫...

Android 設定鈴聲

最主要的 ringtonemanager.setactualdefaultringtoneuri this,ringtonemanager.type ringtone,newuri 第乙個引數表示上下文 第二個引數表示設定的鈴聲狀態,第三個表示當前的歌曲uri。如果傳進來的歌曲路徑不存在,則直接呼叫...

Android 鈴聲設定

鈴聲預製 新增音訊檔案 frameworks base data sounds 修改mk檔案 frameworks base data sounds allaudio.mk allaudio.mk新增 build make target product full base.mk 編譯到裝置 syst...