2010-11-17 11 views
8

Escribí un fragmento de código para agregar un tono de llamada de una URL en Android 2.1. En Froyo, no quiere trabajar en absoluto.Android tono de ajuste de Froyo

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

Cuando llego a insertar puedo obtener esta excepción:

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) 

I Google mi un ** de este error, pero parece que pueda obtener información de nada de esto error.I miraba fuente de Android y el problema parece ser que cuando no tienes carátula del álbum genera una url "content: // media/external/audio/albumart/-1" y el urlmatcher no coincide con ninguna de las URL especificadas y luego arrojo este error .

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

¿Alguien tiene alguna idea de cómo puedo evitar eso?

Respuesta

3

Tuve este error en mi aplicación con un puñado de usuarios, pero finalmente lo solucioné.

En mi aplicación, le dije al escáner de medios que no escaneara mis directorios colocando un archivo en el directorio llamado .nomedia. Creo que esto podría haber confundido el escáner de medios porque quería usar un archivo del directorio.

Cuando se configuró como tono de llamada/notificación/alarma, copié el sonido requerido en un directorio llamado/sdcardpath/ringtones/sdcardpath/notificaciones/sdcardpath/alarmas y luego usé el mismo código para establecer el archivo desde allí.

Esta es la función de copia que hice

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


    } 

Entonces me puse como tono de llamada con este código:

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

     } 

Espero que esto ayude a alguien, ya que me tomó años para trabajar éste hacia fuera

0

Debe revisar el uri, no es posible encontrar el archivo "-1". Tal vez si guardó el archivo antes de llamar al Intent, funcionaría.

Cuestiones relacionadas