2011-01-05 8 views
16

sdcard/media/audio/ringtoneのフォルダに保存ファイルがあります。そのファイルはsettings/sound/phone着信音の着信音のリストに表示されます。オーディオファイルを着信音として設定

しかし、私は自分のコードから着信音としてそのファイルを設定したいと思います。 ここに私のコードです。ここ

File k = new File(path, filename); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "TwiAppclip"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*"); 
    values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); 
    values.put(MediaStore.Audio.Media.IS_ALARM, false); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k 
     .getAbsolutePath()); 
    Uri newUri = getApplicationContext().getContentResolver().insert(uri, values); 

    RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(), 
     RingtoneManager.TYPE_RINGTONE, newUri); 

uri私は取得していますしかし、私はnewUri = nullを得ました。私はそれが着信音として設定されていない理由だと思う。

誰が問題を抱えていますか? newUriはどうすれば適切ですか?

+1

が、私は生のフォルダに私の着メロを入れた場合、私はPATHとして何を指定する必要がありますか? :) – Roylee

答えて

35

オーディオは着信音として1回だけ設定されていますが、この問題の解決方法は次のとおりです。 - 同じコードをもう一度実行しようとするとMediaStoreのテーブルに重複したエントリが挿入されますが、SQLiteデータベースは許可しません君は。ファイルの名前を変更して別のインスタンスを追加するか、エントリに移動してエントリを削除してから、もう一度やり直す必要があります。だから私は毎回そのエントリを削除し、再度それを挿入します。代わりに、以前に挿入されたURIを削除するので

Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); 
Uri newUri = getContentResolver().insert(uri, values); 

RingtoneManager.setActualDefaultRingtoneUri(activity.this, 
     RingtoneManager.TYPE_RINGTONE, newUri); 
+2

Genius!ありがとうございました、私は、重複を正しく照会する方法に関する構文について、全面的に検索してきました。 – Nick

+0

ありがとうございました。すごく良かった。私は数週間これを探していたし、何を知っている。 catchブロックはこの例外をキャッチしますが、例外変数はnullです。私はこの問題になるかもしれないという手がかりを持っていませんでした。ありがとうございます:D – drulabs

+1

-1この回答はうまくいきません!削除のチェックがないので、このコードはUriを取得して削除するのを怠るコードです!より正確な答えは、メディアの_IDを取得することであり、このint nRowsDeleted = getContentResolver()。delete(Uri.parse(MediaStore.Audio.Media.EXTERNAL_CONTENT_UR I + "/" + _ID)、null、null); if(nRowsDeleted> 0){//削除しました} else {//削除に失敗しました} – t0mm13b

1
RingtoneManager.setActualDefaultRingtoneUri(
Context, 
RingtoneManager.TYPE_RINGTONE, 
Uri 
.parse("Media file uri")); 

私はこれがurの問題を解決すると思います。

+2

私はあなたが質問を持っているとは思わない。 – drulabs

3

、あなたはそれを再利用することができます

// check if file already exists in MediaStore 
    String[] projection = {MediaStore.Audio.Media._ID}; 
    String selectionClause = MediaStore.Audio.Media.DATA + " = ? "; 
    String[] selectionArgs = {ringtoneFile.getAbsolutePath()}; 
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selectionClause, selectionArgs, null); 
    Uri insertedUri; 
    if (cursor == null || cursor.getCount() < 1) { 
     // not exist, insert into MediaStore 
     ContentValues cv = new ContentValues(); 
     cv.put(MediaStore.Audio.Media.DATA, ringtoneFile.getAbsolutePath()); 
     cv.put(MediaStore.MediaColumns.TITLE, ringtoneFile.getName()); 
     insertedUri = context.getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, cv); 
    } else { 
     // already exist 
     cursor.moveToNext(); 
     long id = cursor.getLong(0); 
     insertedUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id); 
    } 
    RingtoneManager.setActualDefaultRingtoneUri(context, type, insertedUri); 
+0

これは、以前の着信音を「置き換える」という意味ですか? –

関連する問題