2012-06-30 2 views
2

У меня небольшая проблема с моим приложением для Android. У меня есть некоторые mp3-файлы в моем приложении, которые я хочу установить в качестве мелодии звонка по умолчанию или уведомления. Я следовал инструкциям на этом посту Setting Ringtone in Android и это вроде как работы.Набор мелодий для Android установлен только в первый раз

вот мой код:

Создание файла для установки в качестве мелодии звонка:

public static String createFile(String raw, int choice){ 
    File newSoundFile = null; 
    String path = (choice == 0) ? "/mnt/sdcard/media/mySoundsRingtone.mp3" : "/mnt/sdcard/media/mySoundsNotification.mp3"; 
    newSoundFile = new File(path); 
    if(newSoundFile.exists()){ 
     try { 
      newSoundFile.delete(); 
     } catch (Exception e) { 
      Toast.makeText(cont, "delete failed", Toast.LENGTH_SHORT).show(); 
      return null; 
     } 

    } 

    try { 
     newSoundFile.createNewFile(); 
    } catch (IOException e) { 
     Toast.makeText(cont, "file creation failed", Toast.LENGTH_SHORT).show(); 
     return null; 
    } 
    //Toast.makeText(cont, "file created", Toast.LENGTH_SHORT).show(); 



    Uri mUri = Uri.parse("android.resource://my.package.name/"+raw); 

    ContentResolver mCr = cont.getContentResolver(); 
    AssetFileDescriptor soundFile; 
    try { 
      soundFile= mCr.openAssetFileDescriptor(mUri, "r"); 
     } catch (FileNotFoundException e) { 
      Toast.makeText(cont, "AssetFileDescriptor failed", Toast.LENGTH_SHORT).show(); 
      soundFile=null; 
      return 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 (Exception io) { 
      Toast.makeText(cont, "copy failed", Toast.LENGTH_SHORT).show(); 
      return null; 
     } 

    return path; 
} 

Установка файла в качестве мелодии звонка:

Вызов как:

public static void setRingTone(String raw, int choice){ 
    setValues(createFile(raw, choice), choice); 


} 

, так что происходит : в первый раз, когда я выбираю мелодию для создания нового файла, и звук правильно назначается в качестве мелодии звонка. Если я снова нажму, чтобы выбрать мелодию звонка, старый файл рингтона будет удален и воссоздан должным образом, но он не будет установлен в качестве мелодии звонка (когда я позвоню, я получаю только вибрацию). НО, если я удалю файл .mp3 вручную и перейду в свое приложение и выберем рингтон снова, он будет работать. Почему он ведет себя по-другому, когда я удаляю файл из своего кода, чем когда он удаляется вручную из файлового браузера?

Любые идеи в чем проблема?

Заранее благодарен!

+0

возможно дубликат [Настройка Мелодии в Android] (http://stackoverflow.com/questions/1986756/setting-ringtone-in-android) – sshashank124

ответ

2

Ok после нескольких часов поисков я нашел ответ на это сообщение: setting audio file as Ringtone

(я не знаю, как отметить мой вопрос как дубликат)

0

Для меня его не работает в первой время, но он работает со второго раза и далее

Uri ruri = Uri.parse("content://media/internal/audio/media/37"); 

try 

{ 

RingtoneManager.setActualDefaultRingtoneUri(context,RingtoneManager.TYPE_RINGTONE,  
ruri); 

} 

catch (Throwable t) 

{ 

// error handling goes here -- also, use something other than Throwable 

} 

AudioManager audio = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 

audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL); 

for (int volumeType: (new int[] { AudioManager.STREAM_SYSTEM, 

AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION, AudioManager.STREAM_ALARM 
})) 

{ 

int maxVolume = audio.getStreamMaxVolume(volumeType); 


audio.setStreamVolume(volumeType, maxVolume,AudioManager.FLAG_PLAY_SOUND |  
AudioManager.FLAG_VIBRATE); 

audio.setStreamMute(volumeType, false); 

audio.setVibrateSetting(volumeType,AudioManager.VIBRATE_SETTING_ON); 

} 

} 

catch (Exception e) 
{ 

// TODO: handle exception 

} 

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