2009-12-31 4 views
12

Possible en double:
How to set ringtone in Android from my activity?Réglage Sonnerie dans Android

Je sons des fichiers dans ma résolution/dossier cru et je veux choisir un son pour définir comme sonnerie sur le clic d'un bouton. Je me demande comment je peux faire ça?

+0

avez-vous déjà trouvé une solution? – vondip

+1

Ce n'est pas un doublon! cela parle de définir une sonnerie à partir d'un fichier brut. L'autre est juste comment définir une sonnerie déjà sur la carte SD. S'il vous plaît rouvrir j'ai une solution complète. – ozmike

Répondre

-1

utiliser « anneaux » Extended http://www.androidapps.com/t/rings-extended

Avec cette application installée quand vous allez changer votre sonnerie, vous aurez la possibilité de sélectionner Rings Extended. Utilisez également "Ringdroid" pour éditer les sonneries.

+0

Je veux un exemple de code source pour intégrer cette fonctionnalité dans mon application. –

+0

http://code.google.com/p/apps-for-android/source/browse/#svn/trunk/RingsExtended/src/com/example/android/rings_extended – SuperJames

5

Essayez ceci, cela fonctionne pour moi:

ContentValues values = new ContentValues(); 
values.put(MediaStore.MediaColumns.DATA, <<asbolutePathToYourAudioFileHere>>); 
values.put(MediaStore.MediaColumns.TITLE, "<<yourRingToneNameHere>>"); 
values.put(MediaStore.MediaColumns.SIZE, k); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg"); // assuming it's an mpeg, of course 
values.put(MediaStore.Audio.Media.ARTIST, "<<yourArtistNameHere>>"); 
// values.put(MediaStore.Audio.Media.DURATION, duration); // doesn't appear to be necessary if you don't know 
values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 

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

RingtoneManager.setActualDefaultRingtoneUri(
           <<MyActivity>>.this, 
           RingtoneManager.TYPE_RINGTONE, 
           newUri); 
1

Espérons maintenant que vous avez obtenu votre programme fonctionne comme vous le vouliez. Juste pour l'enregistrement cependant, vous devriez regarder en sauvegardant le dossier sur la carte SD sous un dossier de sonneries. Assurez-vous qu'il est inférieur car cela importe dans Android.

27

@Maxood

Le code de @Clive est ce que vous devez régler la sonnerie. Vous aurez besoin du chemin absolu vers le fichier, que vous ne pouvez pas obtenir à partir d'une ressource brute.

La solution est d'obtenir l'actif du fichier de ressources et de l'écrire sur la carte SD 1ère, avant de le donner au résolveur de contenu pour insertion.

File newSoundFile = new File("/sdcard/media/ringtone", "myringtone.oog"); 
Uri mUri = Uri.parse("android.resource://com.your.package/R.raw.your_resource_id"); 
ContentResolver mCr = app.getContentResolver(); 
AssetFileDescriptor soundFile; 
try { 
     soundFile= mCr.openAssetFileDescriptor(mUri, "r"); 
    } catch (FileNotFoundException e) { 
     soundFile=null; 
    } 

    try { 
     byte[] readData = new byte[1024]; 
     FileInputStream fis = soundFile.createInputStream(); 
     FileOutputStream fos = new FileOutputStream(newSoundFile); 
     int i = fis.read(readData); 

     while (i != -1) { 
     fos.write(readData, 0, i); 
     i = fis.read(readData); 
     } 

     fos.close(); 
    } catch (IOException io) { 
    } 

Ensuite, vous pouvez utiliser la solution

 ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, newSoundFile.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "my ringtone"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/oog"); 
    values.put(MediaStore.MediaColumns.SIZE, newSoundFile.length()); 
    values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); 
    values.put(MediaStore.Audio.Media.IS_ALARM, true); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath()); 
    Uri newUri = mCr.insert(uri, values); 


    try { 
     RingtoneManager.setActualDefaultRingtoneUri(getContext(), RingtoneManager.TYPE_RINGTONE, newUri); 
    } catch (Throwable t) { 
     Log.d(TAG, "catch exception"); 
    } 

tition Ne pas oublier d'écrire le l'autorisation

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

dans votre manifeste

this helps

+5

N'essayant pas de battre un cheval mort ici, mais assurez-vous d'avoir la permission dans votre manifeste si vous écrivez sur la carte SD sinon vous obtiendrez une erreur. – dell116

+2

À noter également: Veillez à définir l'URI comme tel - Uri uri = Uri.parse ("android.resource: //com.example.myapp/" + R.raw.my_resource); ou Uri uri = Uri.parse ("android.resource: //com.example.myapp/raw/my_resource"); http://developer.android.com/reference/android/content/ContentResolver.html#openAssetFileDescriptor%28android.net.Uri,%20java.lang.String%29 – worked

+0

Vous devez créer un répertoire brut dans votre projet sous le répertoire res évident peut-être mais pas pour moi, my_resource est le nom du fichier moins l'extension – ozmike

Questions connexes