2011-09-24 5 views
2

Ceci a été modifié par rapport à l'article d'origine.Sonnerie joue la sonnerie par défaut

Fondamentalement ce qui se passe est que j'ai obtenu ceci pour afficher la sonnerie dans la liste de sonnerie sur le téléphone. Il le sélectionne également. Dans ce code, il joue la sonnerie après qu'il a été sélectionné (je l'ai retiré pour réduire la taille). Il semble jouer la sonnerie par défaut des téléphones. Des idées pourquoi? Merci

private void ringtone(int p){ 
    File newSoundFile = new File("/sdcard/media/ringtone", "raven.wav"); 
    Uri mUri = Uri.parse("android.resource://com.fs.hh/"+R.raw.raven); 
    ContentResolver mCr = 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(); 
      soundFile.close(); 
     } catch (IOException io) { 
     } 

     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/wav"); 
     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()); 
     mCr.delete(uri, MediaStore.MediaColumns.DATA + "=\"" + newSoundFile.getAbsolutePath() + "\"", null); 

     Uri newUri = mCr.insert(uri, values); 



     RingtoneManager.setActualDefaultRingtoneUri(Soundboard.this, RingtoneManager.TYPE_RINGTONE, newUri); 



} 

J'ai également essayé d'ajouter une sonnerie après/après et en lui faisant obtenir la taille d'octet. Aucun n'a travaillé.

J'ai également essayé ce morceau de code et il provoque le même problème. Il apparaît sélectionné dans la section de notification, mais le son en cours de lecture n'est pas le bon son. Cela ressemble à une sonnerie par défaut.

private boolean setRingtone(int p){ 
    int ressound = whichSound(p); //The R.raw.sound 
    String fileTitle = fileTitle(p); // sound 
    String soundTitle = soundTitle(p); // Sound 
    byte[] buffer=null; 
    InputStream fIn = getBaseContext().getResources().openRawResource(ressound); 
    int size=0; 

    try { 
    size = fIn.available(); 
    buffer = new byte[size]; 
    fIn.read(buffer); 
    fIn.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false; 
    } 

    String path="/sdcard/media/notification"; 
    String filename=fileTitle+".wav"; 

    boolean exists = (new File(path)).exists(); 
    if (!exists){new File(path).mkdirs();} 

    FileOutputStream save; 
    try { 
    save = new FileOutputStream(path+filename); 
    save.write(buffer); 
    save.flush(); 
    save.close(); 
    } catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    return false; 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false; 
    } 

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename))); 

    File k = new File(path, filename); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, soundTitle); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/wav"); 
    values.put(MediaStore.Audio.Media.ARTIST, "HH"); 
    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 newUri= this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values); 

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

     return false; 
     } 

Répondre

2

Voici ce qui l'a finalement corrigé.

private boolean setRingtone(int p){ 
    int ressound = whichSound(p); 
    String fileTitle = fileTitle(p); 
    String soundTitle = soundTitle(p); 
    byte[] buffer=null; 
    InputStream fIn = getBaseContext().getResources().openRawResource(ressound); 
    int size=0; 

    try { 
    size = fIn.available(); 
    buffer = new byte[size]; 
    fIn.read(buffer); 
    fIn.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false; 
    } 

    String path=Environment.getExternalStorageDirectory().getPath()+"/media/ringtone/"; 

    String filename=fileTitle+".wav"; 

    boolean exists = (new File(path)).exists(); 
    if (!exists){new File(path).mkdirs();} 

    FileOutputStream save; 
    try { 
    save = new FileOutputStream(path+filename); 
    save.write(buffer); 
    save.flush(); 
    save.close(); 
    } catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    return false; 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false; 
    } 

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename))); 

    File k = new File(path, filename); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, soundTitle); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/wav"); 
    values.put(MediaStore.Audio.Media.ARTIST, ""); 
    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); 

    //Insert it into the database 
    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(this, RingtoneManager.TYPE_RINGTONE, newUri); 



    return false; 
     } 

Dans le chemin cordes en ajoutant Environment.getExternatStorageDirectory(). GetPath() au lieu de simplement la carte SD, il était en fait capable de jouer le son et fonctionner correctement.

+0

J'ai essayé le code ci-dessus, mais continue à recevoir des exceptions "FileNotFound". Je teste sur l'émulateur ... cela fait-il une différence? – worked

+2

@ worked Je ne crois pas que l'émulateur puisse faire des sonneries comme ça. – steven

+0

Il peut, juste nécessaire de définir les autorisations correctes, et donner à la carte SD une quantité d'espace réelle. – worked

0

Uri muri = Uri.parse ("android.resource: //com.packange.name/" + R.raw.raven);

« com.packange.name » doit être le nom de votre forfait , je suppose que vous l'appeliez comme minutieusement le ça. Hardcode le nom de votre paquet, ou appelez getPackageName() dans un contexte approprié.

Mise à jour: Vous pouvez obtenir un uri de votre objet newSoundFile, il suffit de faire Uri.fromFile(newSoundFile).

+0

@steven: Modifiez ensuite votre question pour refléter le code réel. –

+0

@steven: Ce n'est toujours pas votre nom de package, n'est-ce pas? Avez-vous appelé votre paquet "com.package.name" ?? –

+0

Où devrais-je utiliser Uri.fromFile (newSoundFile)? Je ne pouvais pas l'utiliser à partir de la droite mUri parce que alors il n'y aurait rien envoyer réellement ce fichier sonore dans – steven