2009-12-31 3 views
12

Можно создать дубликат:
How to set ringtone in Android from my activity?Настройка Мелодии в Android

У меня есть звуки файлов в моем Резе/необработанной папке, и я хочу, чтобы выбрать звук, чтобы установить в качестве мелодии звонка на клике кнопки. Интересно, как я могу это сделать?

+0

Вы когда-нибудь находили решение? – vondip

+1

Это не дубликат! это говорит о настройке мелодии звонка из необработанного файла. Другой - это то, как установить рингтон уже на SD-карте. Пожалуйста, заново открыть у меня полное решение. – ozmike

ответ

-1

Я использую «Кольца Extended» http://www.androidapps.com/t/rings-extended

С этим приложением было установлено, когда вы идете, чтобы изменить свою мелодию звонка у вас будет возможность выбрать Rings Extended. Также используйте «Ringdroid» для редактирования рингтонов.

+0

Я хочу пример исходного кода для включения этой функции в мое приложение. –

+0

http://code.google.com/p/apps-for-android/source/browse/#svn/trunk/RingsExtended/src/com/example/android/rings_extended – SuperJames

5

Попробуйте, это работает для меня:

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

Надеется, что теперь вы получили программу работать так, как вы хотели. Только для записи, однако, вы должны посмотреть на сохранение файла на SD-карте в папке с рингтонами. Удостоверьтесь, что это меньше, так как это имеет значение в Android.

27

@Maxood

код из @Clive является то, что вам нужно, чтобы установить мелодию звонка. Вам понадобится абсолютный путь к файлу, который вы не можете получить из необработанного ресурса.

Решение состоит в том, чтобы получить ресурс файла ресурсов и записать его на SD-карту 1-го, прежде чем вы передадите его распознавателю содержимого для вставки.

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) { 
    } 

Затем вы можете использовать ранее размещенные решения

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

Не забудьте указать разрешения

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

в манифесте

надеюсь, что это помогает

+5

Не пытайтесь победить мертвую лошадь здесь, но убедитесь, что у вас есть разрешение в вашем манифесте, если вы пишете на SD-карту, иначе вы получите сообщение об ошибке. – dell116

+2

Также обратите внимание: обязательно установите uri так: Uri uri = Uri.parse ("android.resource: //com.example.myapp/" + R.raw.my_resource); или Uri uri = Uri.parse ("android.resource: //com.example.myapp/raw/my_resource"); http://developer.android.com/reference/android/content/ContentResolver.html#openAssetFileDescriptor%28android.net.Uri,%20java.lang.String%29 – worked

+0

Вы должны создать необработанный каталог в своем проекте под директорией res, очевидно возможно, но не для меня, my_resource - это имя файла минус .extension – ozmike

Смежные вопросы