2010-06-12 15 views
2

Mon objectif est de définir le son de notification des utilisateurs à partir d'un fichier stocké sur la carte SD dans l'application. J'utilise ce code:Définition de la notification de sonnerie à partir du fichier de carte 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(); 
} 

Quand je lance ceci sur l'appareil que je continue à obtenir l'erreur:

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 

Je l'ai vu d'autres à l'aide de cette technique et je ne peux trouver aucune documentation sur laquelle Les valeurs doivent être transmises pour ajouter le fichier dans le système Android afin qu'il puisse être défini comme une notification.

Répondre

14

Corriger votre code à ceci:

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 
); 

N'oubliez pas de faire attention à tester ce code! Cela fonctionne seulement honnêtement la première fois. Si vous essayez de réexécuter le même code, vous essayez de placer une entrée en double dans la table de MediaStore, et la base de données SQLite ne vous le permettra pas, vous donnant exactement la même erreur. Vous devez soit renommer votre fichier et en ajouter une autre, soit entrer, supprimer l'entrée, puis réessayer. Pour ce faire, vous pouvez utiliser RingDroid. Assurez-vous simplement que tout l'audio est visible et recherchez votre nom de fichier, puis supprimez-le à partir de là. Alternativement, vous pouvez regarder leur source pour la suppression de la table.

+0

Merci beaucoup pour éclaircir le problème avec double. Bien sûr, cela se produit lorsque vous essayez de comprendre le code et le message n'est pas très clair quel est le problème. Alors merci encore de sauver mon sommeil ;-) –

6

Rappelez-vous de mettre l'étiquette « utilise-autorisation » dans le AndroidManifest.xml avec l'attribut android:name défini à android.permission.WRITE_SETTINGS.

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

Weston vous avez raison après la suppression de la base de données de formulaire d'inscription et l'ajouter fonctionnera pour ce problème

code pour la suppression de l'entrée

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

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

Merci pour la ligne 'supprimer'. –

+0

oui, c'est vraiment utile ... bienvenue. – djk

+0

Merci djk pour votre réponse. – Chirag