在Jelly Bean級別18之前,我可以使用不在Media store中的音樂文件(例如,文件夾中的private
.mp3文件包含.nomedia
文件,因此Media掃描儀不掃描此文件夾,但不知道這個文件),但從Android 4.3(在Nexus 4上測試)我不能這樣做,它只適用於Media Scanner已掃描的音樂文件。如何將不在Media Store中的音樂文件設置爲鈴聲
這個問題的真正原因是我無法將ContentValues與MediaColumns插入.DATA是未由Media Scanner掃描的文件的絕對路徑,insert方法始終返回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);
}
請你可以把一個完整的代碼,以便我們可以試試嗎? –
我剛剛添加了我的代碼。 – Wayne
阿波羅(音樂播放器)可以做到這一點,所以它可以做到。檢查Apollo的源代碼https://github.com/CyanogenMod/android_packages_apps_Apollo,看看你能從這裏瞭解到什麼。 – user2606414