Android: сохранить звук в качестве мелодии звонка и уведомления

Я сохраняю звук из своего приложения для использования в качестве мелодии звонка или звука уведомления. Вот часть моего кода, взятого с эта страница:

ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, soundName);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg");
values.put(MediaStore.Audio.Media.ARTIST, "artist");
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(k.getAbsolutePath());
this.getContentResolver().insert(uri, values);

Насколько я понимаю, звук будет сохранен, а также мелодия звонка, звук уведомления и будильник, так как все флаги установлены на «истина». По крайней мере, на эмуляторе это работает, но на самом устройстве звук появляется только в списке мелодий звонка, и я понятия не имею, почему.

РЕДАКТИРОВАТЬ: я попытался продолжить расследование: удаление строки с «IS_RINGTONE» ничего не изменит (в случае, если одновременно можно использовать только один флаг), звук не отображается в списке с уведомлением- звуки.

Любая помощь приветствуется.

С уважением, Select0r


person Select0r    schedule 12.10.2010    source источник
comment
Кто-нибудь знает, возможно ли это на FLASH CS5.5???? Я разработал там звуковую панель, в которую мне действительно очень нужно добавить рингтоны в срочном порядке.   -  person    schedule 18.10.2011


Ответы (3)


Я поиграл с путем, чтобы решить эту проблему, и вот решение, которое я придумал до сих пор:

На эмуляторе путь не имеет значения, звук появится и в рингтоне, и в списке уведомлений.

На телефоне звук будет отображаться в списке мелодий звонка, если файл сохранен в /media/audio/ringtones ИЛИ /media/audio/, но НЕ в качестве уведомления.
Если я использую путь /media/audio/notifications, звук, наконец, появится в списке уведомлений (!) но НЕ в рингтонах больше.

Получается, мне нужно сохранить звук дважды, чтобы он попал в оба списка? (Но почему сохранение один раз работает на эмуляторе?)

Если есть другой способ поместить звуки в оба списка (или даже в три списка, есть и сигналы будильника, я просто не стал с ними возиться) с однократным сохранением, пожалуйста, дайте мне знать. (Сейчас мой обходной путь — это диалоговое окно, позволяющее пользователю выбирать, сохранять ли звук в качестве мелодии звонка или уведомления.)

person Select0r    schedule 28.10.2010
comment
Я тоже столкнулся с этой проблемой на своей деке. Насколько я могу судить, вы должны сохранить его несколько раз. Я просто использовал AlertDialog, который дал возможность сохранить его, который изменил путь. Но поскольку вы хотите сохранить его в обоих списках, я думаю, вам нужно сохранить его дважды. - person Snailer; 03.11.2010
comment
После тестирования и исследований я считаю, что это действительно правильный путь, спасибо за подтверждение. Думаю, я буду придерживаться своего обходного пути и спрошу пользователя, где сохранить файл, вместо того, чтобы просто сохранять звук дважды (как вы тоже упомянули). Несмотря на то, что это не было моим намерением, я думаю, что это лучше для удобства использования. - person Select0r; 03.11.2010

Помогает ли это, если вы попытаетесь перейти с MediaStore.Audio.Media на AudioColumns? Нравится:

values.put(AudioColumns.ARTIST, "artist");
values.put(AudioColumns.IS_RINGTONE, true);
values.put(AudioColumns.IS_NOTIFICATION, true);
values.put(AudioColumns.IS_ALARM, true);
values.put(AudioColumns.IS_MUSIC, false);

В ссылке не говорится, что MediaStore.Audio.Media устарел, но я думаю, что AudioColumns теперь используется. Я использую его в своем приложении, и, похоже, он работает.

person Eric Nordvik    schedule 03.11.2010
comment
Хороший вопрос, спасибо. Я попробую это и вернусь к вам, если это сработает. - person Select0r; 03.11.2010
comment
Я пытался использовать AudioColumns, но не смог заставить его работать, чтобы вообще сохранить мелодию звонка или звук уведомления на моем устройстве, поэтому MediaStore.Audio.Media кажется подходящим способом. - person Select0r; 03.11.2010

Вы должны изучить API медиаплеера в Android, т.е. android.media.MediaPlayer; android.media.MediaPlayer.OnCompletionListener . Вот он: http://developer.android.com/reference/android/media/package-summary.... И вот как вы воспроизводите звук при срабатывании прослушивателя кликов:

     private OnClickListener btnDontBeStupidListener = new 
OnClickListener() 
            { 
                public void onClick(View v) 
                { 
                  //Toast.makeText(getBaseContext(), "Don't Be Stupid audio file 
is being played", Toast.LENGTH_SHORT).show(); 
                  final MediaPlayer mp = MediaPlayer.create(iMEvil.this, 
R.raw.stupid); 
                  //mp.start(); 
                  try { 
                          mp.start(); 
                          //mp.release(); 
                  }catch(NullPointerException e){ 
                        Log.v("MP error", e.toString()); 
                  } 
                  mp.setOnCompletionListener(new OnCompletionListener(){ 
                      // @Override 
                      public void onCompletion(MediaPlayer arg0) { 
                         mp.release(); 
                      } 
                 }); 
                } 
            }; 

Кроме того, вы пробовали записывать звук во время воспроизведения? Попробуйте и посмотрите, работает ли это.

person Muhammad Maqsoodur Rehman    schedule 02.11.2010
comment
Я не пытаюсь воспроизвести звук и не записываю его. Также здесь не используется никакого ClickListener. Вы хоть читали вопрос? - person Select0r; 02.11.2010