2011-01-05 144 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

如果我把我的手機鈴聲在原始文件夾,我應該指定爲路徑? :) – Roylee 2013-05-22 14:30:16

回答

35

音頻僅設置爲鈴聲一次,但解決此問題的方法是 - 如果您試圖再次運行相同的代碼,您將在MediaStore表中插入重複條目,但SQLite數據庫不允許您。您必須重命名文件並添加另一個實例,或者進入,刪除條目,然後重試。所以我每次都刪除那個條目然後再插入一次。

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

天才!謝謝,我一直在搜索關於如何正確查詢重複的語法。 – Nick 2012-03-25 20:43:49

+0

謝謝你。那太棒了。我一直在尋找這個星期,你知道什麼。 catch塊捕獲這個異常,但異常變量爲空。我不知道這可能是這個問題。謝謝:D – drulabs 2012-05-03 05:44:37

+1

-1這個答案,因爲它不工作!缺少對刪除的檢查,所以圍繞獲取Uri並執行刪除操作的代碼是惰性代碼!更正確的答案是獲得媒體的_ID和這個int nRowsDeleted = getContentResolver()。delete(Uri.parse(MediaStore.Audio.Media.EXTERNAL_CONTENT_UR I +「/」+ _ID),null,null);如果(nRowsDeleted> 0){/ /刪除工作}其他{/ /刪除失敗} – t0mm13b 2012-06-19 12:39:02

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

我認爲這將解決你的問題。

+2

我不認爲你有這個問題。 – drulabs 2012-05-02 11:50:49

3

而不是刪除以前插入的URI,你可以重複使用它:

// 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

這是否意味着「取代」以前的鈴聲? – 2015-05-24 01:55:31

相關問題