2010-11-17 4 views
8

J'ai écrit un morceau de code pour ajouter une sonnerie à partir d'une URL dans Android 2.1. Froyo ne veut pas du tout travailler.Android Froyo réglage sonnerie

sendBroadcast(new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri 
.fromFile(file))); 

ContentValues values = new ContentValues(); 

values.put(MediaStore.MediaColumns.DATA, 
file.getAbsolutePath()); 

values.put(MediaStore.MediaColumns.TITLE, filenameBase); 
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");   
values.put(AudioColumns.IS_RINGTONE, true); 
values.put(AudioColumns.IS_NOTIFICATION, false); 
values.put(AudioColumns.IS_ALARM, false); 
values.put(AudioColumns.IS_MUSIC, false); 

Uri uri = MediaStore.Audio.Media.getContentUriForPath(file 
.getAbsolutePath()); 

Uri newUri = RingtoneModule.this.getContentResolver() 
.insert(uri, values); 

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

Quand je reçois d'insérer je reçois cette exception:

11-17 09:54:51.802: ERROR/DatabaseUtils(379): java.lang.IllegalStateException: Unknown URL: content://media/external/audio/albumart/-1 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at com.android.providers.media.MediaProvider.query(MediaProvider.java:1666) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at com.android.providers.media.MediaProvider.getAlbumArtOutputUri(MediaProvider.java:2983) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at com.android.providers.media.MediaProvider.makeThumbInternal(MediaProvider.java:3192) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at com.android.providers.media.MediaProvider.getThumb(MediaProvider.java:3070) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:2029) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at com.android.providers.media.MediaProvider.insert(MediaProvider.java:1843) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at android.content.ContentProvider$Transport.insert(ContentProvider.java:180) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:175) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at android.os.Binder.execTransact(Binder.java:288) 
11-17 09:54:51.802: ERROR/DatabaseUtils(379):  at dalvik.system.NativeStart.run(Native Method) 

je google mon un ** de cette erreur, mais peut sembler obtenir quoi que ce soit sur ce error.I a regardé à la source Android et le problème semble être que quand vous n'avez pas d'album, il génère une url "content: // media/externe/audio/albumart/-1" et l'urlmatcher ne correspond à aucune des URLs spécifiées, puis jette cette erreur .

URI_MATCHER.addURI("media", "*/audio/albumart", AUDIO_ALBUMART); 
URI_MATCHER.addURI("media", "*/audio/albumart/#", AUDIO_ALBUMART_ID); 

Quelqu'un at-il une idée de comment je peux contourner cela?

Répondre

3

J'ai eu cette erreur dans mon application avec une poignée d'utilisateurs, je l'ai finalement corrigé. Dans mon application, j'ai dit au scanner de médias de ne pas scanner mes répertoires en mettant un fichier dans le répertoire appelé .nomedia. Je pense que cela a pu confondre le scanner de média car je voulais utiliser un fichier du répertoire. Donc, lorsque la sonnerie/notification/alarme était activée, j'ai copié le son requis dans un répertoire appelé/sdcardpath/sonneries/sdcardpath/notifications/sdcardpath/alarmes, puis j'ai utilisé le même code pour définir le fichier à partir de là.

C'est la fonction de copie que j'ai fait

public void ringtonemove(String ringtype){ 


     String sdcard = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     String outpath = sdcard + "/ringtones"; 
     String path = sdcard + "/multi10/" + Global.currentboard + "/series10"; 

     if (ringtype == "MultiboardRing") {outpath = sdcard + "/ringtones/";} 
     if (ringtype == "MultiboardNotif") {outpath = sdcard + "/notifications/";} 
     if (ringtype == "MultiboardAlarm") {outpath = sdcard + "/alarms/";} 

    File in = new File(path, Global.currentsound); 
    File out = new File(outpath, ringtype + ".ogg"); 
    Global.k = outpath + ringtype + ".ogg"; 



     File folderR = new File(Environment.getExternalStorageDirectory() + "/ringtones"); 
     File folderN = new File(Environment.getExternalStorageDirectory() + "/notifications"); 
     File folderA = new File(Environment.getExternalStorageDirectory() + "/alarms"); 
     if (folderR.exists()); else {folderR.mkdir();} 
     if (folderN.exists()); else {folderN.mkdir();} 
     if (folderA.exists()); else {folderA.mkdir();} 



        Log.d("Notice", "Copying sound file " + in); 
        try { 
         FileInputStream fis = new FileInputStream(in); 
          int size = fis.available(); 
          byte[] buffer = new byte[size]; 
          fis.read(buffer); 
          fis.close(); 

          FileOutputStream fos = new FileOutputStream(out); 
          fos.write(buffer); 
          fos.close(); 



        } catch (FileNotFoundException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 


    } 

Je comme sonnerie avec ce code:

public void function1(int id){ 
      Toast.makeText(this, "Set as ringtone" , Toast.LENGTH_SHORT).show(); 
      String sdcard = Environment.getExternalStorageDirectory().getAbsolutePath(); 

        String path = sdcard + "/multi10/" + Global.currentboard + "/series10"; 


        ringtonemove("MultiboardRing"); 

        File k = new File(Global.k); 

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

         Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()); 
         getContentResolver().insert(uri,values); 
         getContentResolver().delete(uri,MediaStore.MediaColumns.TITLE + "=\"" + "MultiboardRing" +"\"", null); 
         Uri newUri = getContentResolver().insert(uri, values); 

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

     } 

Hope this helps quelqu'un comme cela m'a pris énormément de temps à travailler celui-ci sur

0

Vous devez réviser le uri, il n'est pas possible de trouver le fichier "-1". Peut-être que si vous avez enregistré le fichier avant d'appeler le Intent, cela fonctionnera.

Questions connexes