2010-11-17 14 views
8

Napisałem fragment kodu, aby dodać dzwonek z adresu URL w systemie Android 2.1. W Froyo wcale nie chce pracować.Dzwonek ustawień Android 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); 

Kiedy mogę wstawić otrzymuję ten wyjątek:

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) 

google mój A ** od tego błędu, ale wydaje się uzyskać informacje o nic o tym error.I spojrzał na androida źródła i problem wydaje się, że gdy nie masz okładki albumu, generowany jest adres URL "content: // media/external/audio/albumart/-1", a urlmatcher nie pasuje do żadnego z podanych adresów URL, a następnie zgłoszę ten błąd .

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

Czy ktoś ma pojęcie, jak sobie z tym poradzić?

Odpowiedz

3

Miałem ten błąd w mojej aplikacji z garstką użytkowników, w końcu to naprawiłem.

W mojej aplikacji powiedziałem skanerowi multimediów, aby nie skanował moich katalogów przez umieszczenie pliku w katalogu o nazwie .nomedia Myślę, że mógł to być mylący skaner mediów, ponieważ chciałem użyć pliku z katalogu.

Kiedy ustawiono dzwonek/powiadomienie/alarm został aktywowany Przekopiowałem żądany dźwięk do katalogu o nazwie/sdcardpath/dzwonki/sdcardpath/powiadomienia/sdcardpath/alarmy, a następnie użyłem tego samego kodu do ustawienia pliku z tego miejsca.

Jest to funkcja kopiowania zrobiłem

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


    } 

Potem ustawić jako dzwonek z tym kodem:

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

     } 

nadzieję, że to pomaga kogoś tak zajęło mi wieki, aby działać ten jeden

0

Powinieneś zrewidować numer uri, nie można znaleźć pliku "-1". Może gdybyś zapisał plik przed wywołaniem Intent, to by działało.

Powiązane problemy