2010-06-12 66 views
2

我的目標是從應用程序中的存儲在SD卡上的文件中設置用戶通知聲音。我使用此代碼:設置SD卡文件的鈴聲通知

if(path != null){ 

    File k = new File(path, "moment.mp3"); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "My Song title"); 
    values.put(MediaStore.MediaColumns.SIZE, 215454); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
    values.put(MediaStore.Audio.Media.ARTIST, "Some Artist"); 
    values.put(MediaStore.Audio.Media.DURATION, 230); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, false); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
    values.put(MediaStore.Audio.Media.IS_ALARM, false); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 
    values.put(MediaStore.MediaColumns.DISPLAY_NAME, "Some Name"); 

    //Insert it into the database 
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
    Uri newUri = MainActivity.this.getContentResolver().insert(uri, values); 

    RingtoneManager.setActualDefaultRingtoneUri(
     MainActivity.this, 
     RingtoneManager.TYPE_NOTIFICATION, 
     newUri 
    ); 
    //RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION, newUri); 
    Toast.makeText(this, "Notification Ringtone Set", Toast.LENGTH_SHORT).show(); 
} 

當我在設備上運行這個我不斷收到錯誤:

06-12 15:19:36.741: ERROR/Database(2847): Error inserting is_alarm=false is_ringtone=false artist_id=35 is_music=false album_id=-1 title=My Song title duration=230 is_notification=true title_key=%D%\%%P%H%F%8%%R%<%R%B%4% mime_type=audio/mp3 date_added=1276370376 _display_name=moment.mp3 _size=215454 _data=/mnt/sdcard/Android/data/_MY APP PATH_/files/moment.mp3 
06-12 15:19:36.741: ERROR/Database(2847): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 

我已經看到使用這種技術他人我找不到上的任何文件實際上需要傳入值才能成功將文件添加到Android系統中,以便將其設置爲通知。

回答

14

更正您的代碼如下:

if(path != null){ 

File k = new File(path, "moment.mp3"); 

ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
values.put(MediaStore.MediaColumns.TITLE, "My Song title"); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg"); 
values.put(MediaStore.Audio.Media.ARTIST, "Some Artist"); 
values.put(MediaStore.Audio.Media.IS_RINGTONE, false); 
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
values.put(MediaStore.Audio.Media.IS_ALARM, false); 
values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

//Insert it into the database 
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
Uri newUri = getContentResolver().insert(uri, values); 

RingtoneManager.setActualDefaultRingtoneUri(
    MainActivity.this, 
    RingtoneManager.TYPE_NOTIFICATION, 
    newUri 
); 

切記要小心測試這個代碼!它只是第一次真實地工作。如果您再次運行相同的代碼,您將嘗試在MediaStore的表中推送重複條目,並且SQLite數據庫不允許您提供完全相同的錯誤。您必須重命名文件並添加另一個實例,或者進入,刪除條目,然後重試。要做到這一點,你可以使用RingDroid。只要確保所有音頻都可見,並搜索您的文件名,然後從那裏刪除它。或者,你可以看看他們的來源,從表中刪除。

+0

非常感謝您與雙打清理的問題。當然,當你試圖找出代碼並且消息不是很清楚的時候會發生什麼問題。所以再次感謝您保存我的睡眠;-) – 2011-07-25 23:59:22

6

記得把「使用的許可」標籤中AndroidManifest.xmlandroid:name屬性設置爲android.permission.WRITE_SETTINGS.

uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
13

韋斯頓要刪除的條目形式的數據庫,它會找出這個問題的加入之後

代碼刪除條目

getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null); 

Uri newUri = getContentResolver().insert(uri, values); 
+0

感謝您的'刪除'行。 – 2011-07-25 23:59:45

+0

是的,它真的很有用......歡迎。 – djk 2011-08-31 06:17:09

+0

謝謝你的答案djk。 – Chirag 2012-05-16 06:26:01