2010-11-17 36 views
8

Tôi đã viết một đoạn mã để thêm nhạc chuông từ URL trong Android 2.1. Ở Froyo nó không muốn làm việc chút nào.Nhạc chuông cài đặt 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); 

Khi tôi nhận được để chèn tôi nhận được ngoại lệ này:

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) 

Tôi google một của tôi ** của cho lỗi này nhưng có thể dường như nhận được thông tin gì về error.I này nhìn nguồn android và vấn đề có vẻ là khi bạn không có album nghệ thuật, nó tạo ra một url "nội dung: // media/external/audio/albumart/-1" và urlmatcher không khớp với bất kỳ url nào được chỉ định và sau đó tôi ném lỗi này .

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

Có ai có ý tưởng nào về cách tôi có thể tham gia không?

Trả lời

3

Tôi đã gặp lỗi này trong ứng dụng của mình với một số ít người dùng, cuối cùng tôi đã khắc phục nó.

Trong ứng dụng của mình, tôi đã yêu cầu trình quét phương tiện không quét các thư mục của tôi bằng cách đặt một tệp vào thư mục có tên .nomedia Tôi nghĩ rằng điều này có thể gây nhầm lẫn cho trình quét đa phương tiện vì tôi muốn sử dụng tệp từ trong thư mục.

Vì vậy, khi đặt làm nhạc chuông/thông báo/báo thức được kích hoạt, tôi đã sao chép âm thanh cần thiết vào thư mục có tên/sdcardpath/ringtones/sdcardpath/thông báo/sdcardpath/báo động và sau đó sử dụng cùng một mã để đặt tệp từ đó.

Đây là chức năng sao chép tôi đã

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


    } 

Sau đó, tôi đặt làm nhạc chuông với mã này:

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

     } 

Hy vọng điều này sẽ giúp người như nó đã cho tôi lứa tuổi để làm việc này ra

0

Bạn nên sửa lại uri, không thể tìm thấy tệp "-1". Có thể nếu bạn đã lưu tệp trước khi gọi số Intent, nó sẽ hoạt động.

Các vấn đề liên quan