2010-06-12 75 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