Android Can';不要从MediaStore中删除

Android Can';不要从MediaStore中删除,android,Android,我正在尝试用MP3文件替换用户的铃声。铃声文件按需生成,其内容发生变化;但是,我需要保证文件名及其标题(显示在铃声列表上)保持不变 我可以毫无问题地更换一次铃声,当我第二次尝试添加铃声时,问题就开始了,因为ContentResolver.insert()返回NullPointerException;从我测试的情况来看,发生这种情况是因为已经有一个文件在数据或标题列中注册了相同的值(如果确实是这样的话,我仍然无法找出导致问题的原因) 因此,我试图从MediaStore中删除条目,但没有成功,因为d

我正在尝试用MP3文件替换用户的铃声。铃声文件按需生成,其内容发生变化;但是,我需要保证文件名及其标题(显示在铃声列表上)保持不变

我可以毫无问题地更换一次铃声,当我第二次尝试添加铃声时,问题就开始了,因为ContentResolver.insert()返回NullPointerException;从我测试的情况来看,发生这种情况是因为已经有一个文件在数据或标题列中注册了相同的值(如果确实是这样的话,我仍然无法找出导致问题的原因)

因此,我试图从MediaStore中删除条目,但没有成功,因为delete()返回0,条目保留在MediaStore中。我试过两件事:

尝试#1不会删除条目

getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,"TITLE='TestRing'",null);
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;
        }
    }               
}  
尝试#2也不会删除条目

getContentResolver().delete(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,"TITLE='TestRing'",null);
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

解决后,此代码将删除以前具有相同标题的条目:

getContentResolver().delete(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"TITLE='MyTitle'", null);