开发者

Android Froyo setting ringtone

I wrote a piece of code to add a ringtone from a URL in Android 2.1. In Froyo it does not want to work at all.

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

When I get to insert I get this 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)

I google my a** of for this error but can seem to get anything info about this error.I looked at android source and the problem seems to be that when you dont have album art it generates a url "content://media/external/audio/albumart/-1" and the urlmatcher does not match any of the urls specified and then i throws this error.

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

Does someone have any idea how I can get around that?


I had this error in my application with a handful of users, I finally fixed it though.

In my application I told the media scanner not to scan my directories by putting a file in the directory called .nomedia I think this might have been confusing the media scanner because I wanted to use a file from within the directory.

So when set as ringtone/notification/alarm was activated I copied the required sound to a directory called /sdcardpath/ringtones /sdcardpath/notifications /sdcardpath/alarms and then used the same code to set the file from there.

This is the copy function I made

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


    }

Then I set as ringtone with this 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 someone as it took me ages to work this one out


You should revise the uri, it's not possible to find the file "-1". Maybe if you saved the file before calling the Intent, it would work.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜