在 Jelly Bean 18 级之前,我可以使用不在媒体存储中的音乐文件(例如,private
文件夹中的 .mp3 文件包含.nomedia
文件,因此 Media Scanner 不会扫描此文件夹并且不知道此文件)但来自 Android 4.3 (在 Nexus 4 上测试)我不能这样做,它只适用于媒体扫描仪已经扫描过的音乐文件。
这个问题的真正原因是我无法使用 MediaColumns 插入 ContentValues。DATA 是 Media Scanner 未扫描的文件的绝对路径,插入方法总是返回 null。
Uri newUri = getCR().insert(uri, contentValues); // returns null in Android 4.3
有没有人有解决方法来使用私人文件(未扫描且媒体扫描仪无法识别)作为铃声?
这是我设置铃声的方法:
File ringtoneFile = new File(audio.getPath());
ContentValues cv = new ContentValues();
cv.put(MediaColumns.DATA, ringtoneFile.getAbsolutePath());
cv.put(MediaColumns.TITLE, audio.getTitle());
cv.put(MediaColumns.MIME_TYPE, "audio/*");
if (audio.getArtist() != null)
cv.put(Media.ARTIST, audio.getArtist());
cv.put(Media.IS_RINGTONE, true);
cv.put(Media.IS_NOTIFICATION, false);
cv.put(Media.IS_ALARM, false);
cv.put(Media.IS_MUSIC, false);
Uri uri = Media.getContentUriForPath(ringtoneFile.getAbsolutePath());
Uri newUri = getCR().insert(uri, cv); ////return null in Android 4.3
if (newUri == null)
{
Cursor c = getCR().query(uri, new String[] { Media._ID }, Media.DATA + "=?",
new String[] { ringtoneFile.getAbsolutePath() }, null);
long id = -1;
if (c != null && c.moveToFirst())
{
id = c.getLong(c.getColumnIndex(Media._ID));
newUri = Uri.parse(uri.toString() + "/" + id);
c.close();
}
}
if (newUri != null)
{
RingtoneManager.setActualDefaultRingtoneUri(getAppContext(), RingtoneManager.TYPE_RINGTONE, newUri);
}