ユーザーの着信音をMP3ファイルに置き換えようとしています。着信音ファイルはオンデマンドで生成され、その内容が変更されます。ただし、ファイル名とそのタイトル(着信音リストに表示される)が同じままであることを保証する必要があります。
着信音を問題なく1回置き換えることができます。もう一度着信音を追加しようとすると、ContentResolver.insert()がNullPointerExceptionを返すため、問題が発生します。私がテストしたところ、これは、データ列またはタイトル列に同じ値で登録されたファイルがすでに存在するために発生します(実際に問題が発生したとしても、どちらが問題の原因であるかはまだわかりません)。
したがって、MediaStoreからエントリを削除しようとしていますが、delete()が0を返し、エントリがMediaStoreに残っているため、あまり成功していません。私は2つのことを試しました:
試行#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