Setting Ringtone in Android [duplicate]
Asked Answered
A

4

13

Possible Duplicate:
How to set ringtone in Android from my activity?

I have sounds files in my res/raw folder and i want to select a sound to set as a ringtone on the click of a button. Wonder how can i do that?

Amuck answered 31/12, 2009 at 19:20 Comment(2)
have you ever found a solution?Expeditious
This is not a duplicate! this talks about setting a ringtone from a raw file. The other one is just how to set a ringtone already on the sd card. Please reopen i have a full solution.Dichromaticism
K
28

@Maxood

The code from @Clive is what you need to set the ringtone. You will need the absolute path to the file, which you can't get from a raw resource.

The solution is to get the resource file asset and write it to the sdcard 1st, before you give it to the content resolver for insertion.

File newSoundFile = new File("/sdcard/media/ringtone", "myringtone.oog");
Uri mUri = Uri.parse("android.resource://com.your.package/R.raw.your_resource_id");
ContentResolver mCr = app.getContentResolver();
AssetFileDescriptor soundFile;
try {
       soundFile= mCr.openAssetFileDescriptor(mUri, "r");
   } catch (FileNotFoundException e) {
       soundFile=null;   
   }

   try {
      byte[] readData = new byte[1024];
      FileInputStream fis = soundFile.createInputStream();
      FileOutputStream fos = new FileOutputStream(newSoundFile);
      int i = fis.read(readData);

      while (i != -1) {
        fos.write(readData, 0, i);
        i = fis.read(readData);
      }

      fos.close();
   } catch (IOException io) {
   }

Then you can use the previously posted solution

       ContentValues values = new ContentValues();
   values.put(MediaStore.MediaColumns.DATA, newSoundFile.getAbsolutePath());
   values.put(MediaStore.MediaColumns.TITLE, "my ringtone");
   values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/oog");
   values.put(MediaStore.MediaColumns.SIZE, newSoundFile.length());
   values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
   values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
   values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
   values.put(MediaStore.Audio.Media.IS_ALARM, true);
   values.put(MediaStore.Audio.Media.IS_MUSIC, false);

   Uri uri = MediaStore.Audio.Media.getContentUriForPath(newSoundFile.getAbsolutePath());
   Uri newUri = mCr.insert(uri, values);


   try {
       RingtoneManager.setActualDefaultRingtoneUri(getContext(), RingtoneManager.TYPE_RINGTONE, newUri);
   } catch (Throwable t) {
       Log.d(TAG, "catch exception");
   }

Don't forget to write the the permission

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

in your manifest

hope this helps

Koala answered 25/6, 2010 at 16:54 Comment(7)
Not trying to beat a dead horse here, but make sure you have the permission <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> in your manifest if you're writing to the SD card or else you will get an error.Afford
Also to note: Be sure to set the uri like so - Uri uri = Uri.parse("android.resource://com.example.myapp/" + R.raw.my_resource); or Uri uri = Uri.parse("android.resource://com.example.myapp/raw/my_resource"); developer.android.com/reference/android/content/…Odine
You must create a raw directory in your project under res directory obvious maybe but not for me , my_resource is the file name minus the .extensionDichromaticism
+1 works like a charm, please edit and add comment of @Afford in the post.Balkin
I tried it as it is in onCallStateChanged method. I am getting newUri as null why I don't no please help me..Psychotomimetic
soundFile= mCr.openAssetFileDescriptor(mUri, "r"); please tell me the meaning of this line...Pretonic
mcr is a getContentResolver()Kg
G
5

Try this, it works for me:

ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, <<asbolutePathToYourAudioFileHere>>);
values.put(MediaStore.MediaColumns.TITLE, "<<yourRingToneNameHere>>");
values.put(MediaStore.MediaColumns.SIZE, k);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg");    // assuming it's an mpeg, of course
values.put(MediaStore.Audio.Media.ARTIST, "<<yourArtistNameHere>>");
// values.put(MediaStore.Audio.Media.DURATION, duration);  // doesn't appear to be necessary if you don't know
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);

Uri uri = MediaStore.Audio.Media.getContentUriForPath(outPath);  
Uri newUri = getContentResolver().insert(uri, values);

RingtoneManager.setActualDefaultRingtoneUri(
                                <<MyActivity>>.this,
                                RingtoneManager.TYPE_RINGTONE,
                                newUri);
Gandhiism answered 19/1, 2010 at 9:28 Comment(0)
F
1

Hopefully by now you have gotten your program working the way you wanted. Just for the record though, you should look into saving the file to the sdcard under a ringtones folder. Make sure it is lower cased as that does matter in Android.

Fifteen answered 18/3, 2010 at 3:21 Comment(0)
U
-1

I use "Rings Extended" http://www.androidapps.com/t/rings-extended

With that app installed when you go to change your ringtone you will have the option to select Rings Extended. Also use "Ringdroid" to edit ringtones.

Urgency answered 31/12, 2009 at 19:27 Comment(2)
I want an example source code for incorporating this feature into my app.Amuck
code.google.com/p/apps-for-android/source/browse/#svn/trunk/…Urgency

© 2022 - 2024 — McMap. All rights reserved.