我正在尝试用 MP3 文件替换用户的铃声。铃声文件按需生成,内容变化;但是,我需要保证文件名及其标题(出现在铃声列表中)保持不变。
我可以毫无问题地更换一次铃声,当我第二次尝试添加铃声时,困难就开始了,因为 ContentResolver.insert() 返回 NullPointerException; 根据我的测试,发生这种情况是因为已经在数据或标题列中注册了一个具有相同值的文件(如果确实如此,我仍然无法弄清楚是什么导致了问题)。
所以我试图从 MediaStore 中删除条目,但没有多大成功,因为 delete() 返回 0 并且条目保留在 MediaStore 中。我尝试了两件事:
尝试 #1 不会删除该条目
getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,"TITLE='TestRing'",null);
尝试 #2 也不会删除该条目
final String[] ringColumns = { MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.TITLE,MediaStore.MediaColumns._ID };
final String ringOrderBy = MediaStore.Audio.Media._ID+" DESC";
final String ringWhere = MediaStore.Images.Media.TITLE+"=?";
final String[] ringArguments = { "TestRing" };
Cursor ringCursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ringColumns, ringWhere, ringArguments, ringOrderBy);
if(ringCursor.getCount()>1)
{
while(ringCursor.moveToNext())
{
int id = ringCursor.getInt(ringCursor.getColumnIndex(MediaStore.Audio.Media._ID));
String title = ringCursor.getString(ringCursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
if(title.equals("TestRing"))
{
ContentResolver cr = getContentResolver();
retVal += cr.delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, MediaStore.Audio.Media._ID + "="+id, null );
break;
}
}
}
这是我用来在媒体商店中创建条目的代码,如果不存在条目,则可以正常工作:
File fOut = new File("/mnt/sdcard/media/audio/ringtones/newRingtone.mp3");
if(fOut.exists())
fOut.delete();
ContentValues content = new ContentValues();
content.put(MediaStore.Audio.Media.IS_RINGTONE, true);
content.put(MediaStore.MediaColumns.DATA,fOut.getAbsolutePath());
content.put(MediaStore.MediaColumns.TITLE, "TestRing");
content.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
Uri uri = MediaStore.Audio.Media.getContentUriForPath(fOut.getAbsolutePath());
Uri newUri = getContentResolver().insert(uri, content); //insert returns null on the 2nd insertion