**其實沒有幾行,這裡簡單記錄下學習的過程.
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第二個引數同上,最後乙個是指定乙個新的uri, 這裡的data.get(position)就是在上面的掃瞄**掃瞄出的所有通知鈴聲path路徑中選澤乙個,然後在解析成乙個uri物件傳入即可, ringtonemanager.type_notification, uri.parse(data.get(position)));
那麼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...