前一段时间项目中有需求:系统电话铃声需可以自定义Sdcard中的音乐文件,在高通平台上系统原生是不支持该功能,后来自己写代码将该功能实现了,
但今天客户对该功能提出了新的需求,自定义电话铃声要支持Sdcard热插拔(即系统电话铃声设定为Sdcard中的音乐文件后,拔出Sdcard,电话铃声恢复为系统默认铃声,再插入Sdcard后电话铃声又可恢复为之前设置的Sdcard中的音乐),该功能弄了整整一下午算是实现了,但在代码过程中遇一个难点,无法通过设定为铃声的Uri路径获取该 URI路径文件的名称,抓头挠耳想了很久也没有任何进展,不得不换了另一种繁琐的方法来迂回实现,但另该方法终究还是不行,在后面的代码实现中通行性不强,这可把我给急了....
在系统源码中的Settings应用中NotificationSettings.java类中有一个updateRingtoneName方法,该方法在设置中就是通过返回的铃声URI路径来获取铃声文件名称的显示,现将其记录下来,以便他日用到:
private static CharSequence updateRingtoneName(Context context, int type) {
if (context == null) {
Log.e(TAG, "Unable to update ringtone name, no context provided");
return null;
}
Uri ringtoneUri = RingtoneManager.getActualDefaultRingtoneUri(context, type);
CharSequence summary = context.getString(com.android.internal.R.string.ringtone_unknown);
// Is it a silent ringtone?
if (ringtoneUri == null) {
summary = context.getString(com.android.internal.R.string.ringtone_silent);
} else {
Cursor cursor = null;
try {
if (MediaStore.AUTHORITY.equals(ringtoneUri.getAuthority())) {
// Fetch the ringtone title from the media provider
cursor = context.getContentResolver().query(ringtoneUri,
new String[] { MediaStore.Audio.Media.TITLE }, null, null, null);
} else if (ContentResolver.SCHEME_CONTENT.equals(ringtoneUri.getScheme())) {
cursor = context.getContentResolver().query(ringtoneUri,
new String[] { OpenableColumns.DISPLAY_NAME }, null, null, null);
}
if (cursor != null) {
if (cursor.moveToFirst()) {
summary = cursor.getString(0);
}
}
} catch (SQLiteException sqle) {
// Unknown title for the ringtone
} catch (IllegalArgumentException iae) {
// Some other error retrieving the column from the provider
} finally {
if (cursor != null) {
cursor.close();
}
}
}
return summary;
}