问题:新建闹钟,设置闹钟铃声从文件管理中选择任意一首音乐为铃声,闹铃响时为手机默认铃声
解决:根据经验在AlarmClockFragment.java搜索"title = "找到设置闹铃标题的地方,通过搜索找到getRingToneTitle(Uri uri)方法
/**
* Does a read-through cache for ringtone titles.
*
* @param uri The uri of the ringtone.
* @return The ringtone title. {@literal null} if no matching ringtone found.
*/
private String getRingToneTitle(Uri uri) {
// Try the cache first
String title = mRingtoneTitleCache.getString(uri.toString());
if (title == null) {
title = mContext.getString(R.string.ringtone_default);
if (isRingToneUriValid(uri)) {
// This is slow because a media player is created during Ringtone object creation.
if (uri.getAuthority().equals(DOC_AUTHORITY)) {
title = mDisplayName;
} else {
Ringtone ringTone = RingtoneManager.getRingtone(mContext, uri);
title = ringTone.getTitle(mContext);
}
}
if (title != null) {
mRingtoneTitleCache.putString(uri.toString(), title);
}
}
return title;
}
通过测试发现选择不是sd卡的音乐正常显示标题,选择sd上的音乐仍然显示默认,通过打印发现,
选择sd上的音乐时
isRingToneUriValid(uri)
方法返回为false,点击进入isRingToneUriValid(uri)方法
private boolean isRingToneUriValid(Uri uri) {
if (uri.getScheme().contentEquals("file")) {
File f = new File(uri.getPath());
if (f.exists()) {
return true;
}
} else if (uri.getScheme().contentEquals("content")) {
Cursor cursor = null;
try {
cursor = mContext.getContentResolver().query(uri,
new String[] {
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.DISPLAY_NAME
}, null, null, null);
if (cursor != null && cursor.getCount() > 0) {
if (uri.getAuthority().equals(DOC_AUTHORITY)) {
cursor.moveToFirst();
mDisplayName = cursor.getString(1);
}
return true;
}
} catch (Exception e) {
Log.e("Get ringtone uri Exception: e.toString=" + e.toString());
} finally {
if (cursor != null) {
cursor.close();
}
}
}
return false;
}
通过打印得到的路径去找音乐确实存在但是f.exists()返回为false,很神奇,通过仔细想想这很有可能是访问sd卡的权限没加上所以在清单文件AndroidManifest.xml加上访问sd卡权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
测试成功。