Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 443
Pintac Avatar asked Nov 17 '10 08:11

Pintac


1 Answers

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

like image 138
MrCloister Avatar answered Sep 27 '22 18:09

MrCloister