Как проиграть системный звук?
Добавлено: 11 янв 2012, 11:34
В литературе описан пример, как проиграть файл в res/raw
А как проиграть системный звук?
Как эти звуки выбрать?
А как проиграть системный звук?
Как эти звуки выбрать?
Добро пожаловать на форум сайта
http://forum.startandroid.ru/
Код: Выделить всё
public class MainActivity extends Activity {
ListView lvRing;
Ringtone ringtone;
RingtoneManager rm = new RingtoneManager(this);
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// будем читать все типы звуков (звонок, будильник, уведомление) ...
rm.setType(RingtoneManager.TYPE_ALL);
// ... в курсор
Cursor cursor = rm.getCursor();
// создаем адаптер из курсора и настраиваем список ListView
SimpleCursorAdapter scAdapter = new SimpleCursorAdapter(
getBaseContext(), android.R.layout.simple_list_item_1, cursor,
new String[] { "title" }, new int[] { android.R.id.text1 });
lvRing = (ListView) findViewById(R.id.lvRing);
lvRing.setAdapter(scAdapter);
lvRing.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
// выбираем из курсора нужную мелодию
ringtone = rm.getRingtone(position);
// и играем ее
ringtone.play();
}
});
}
}
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/lvRing"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
Oleg_SS писал(а):Все работает, большое спасибо!
Осталось только разобраться во всем этом. В частности мне надо:
1) запомнить выбраный звук, в переменной строкового типа
2) воспроизвести звук имея эту строковую переменную
3) где храняться все эти звуки? Это, если мне понадобиться добавить еще звуки.
Это маленькая чать большого проекта, в котором все настройки сохраняются в текстовом файле.RagnarR писал(а): [*] Стоит работать не со строковым значением, а сразу с переменной класса Ringtone, так будет гораздо проще.
[*] Тогда отпадает проблема с воспроизведением.
[*] В Андроиде все рингтоны лежат в папочке на SDкарте (/media/audio/notification, /media/audio/ringtones, /media/audio/alarms)[/list]
Можно попытаться через запоминание позиции мелодии. У RingtoneManager есть метод getRingtone().Oleg_SS писал(а): Это маленькая чать большого проекта, в котором все настройки сохраняются в текстовом файле.
Поэтому возник вопрос пункта № 1
А разве нельзя по имени рингтона в lvRing найти его в списке rm (см. пример)
Если можно, то как? Очень надо.
Код: Выделить всё
Ringtone ringtone;
RingtoneManager rm = new RingtoneManager(this);
rm.setType(RingtoneManager.TYPE_ALL);
ringtone = rm.getRingtone(position);
ringtone.play();
Так не получится. Если добавить звук, то позиция поменяется.RagnarR писал(а):Можно попытаться через запоминание позиции мелодии. У RingtoneManager есть метод getRingtone().
Т.е. что-то вроде этого (параметр position берешь из настроек):
Тогда работа с курсором. Создаешь курсор из рингтонов, в цикле пробегаешь по каждому и сверяешь названия, необходимый запускаешь.Oleg_SS писал(а): Так не получится. Если добавить звук, то позиция поменяется.
может есть поиск по имени?RagnarR писал(а):Тогда работа с курсором. Создаешь курсор из рингтонов, в цикле пробегаешь по каждому и сверяешь названия, необходимый запускаешь.Oleg_SS писал(а): Так не получится. Если добавить звук, то позиция поменяется.
Код: Выделить всё
Ringtone ringtone;
RingtoneManager rm = new RingtoneManager(this);
rm.setType(RingtoneManager.TYPE_ALL);
Cursor cursor = rm.getCursor();
cursor.moveToFirst();
try{
while (cursor.isAfterLast() == false){
int index = getColumnIndex("title");
if ( cursor.getString(index).equal(your_song_name) ) {
ringtone = rm.getRingtone(cursor.getPosition());
ringtone.play();
}
}
} finally {
cursor.close();
}
Я так понимаю, что title_key - это название, а content - это сама мелодия.Oleg_SS писал(а):мои исследования курсора показали, что там есть content и title_key
может это то что мне надо?
можно по этим двум параметрам запустить звук?
title_key - какая-то абракадабра (может в другой кодеровке название файла?)RagnarR писал(а):Я так понимаю, что title_key - это название, а content - это сама мелодия.
Верно. Вы говорите адаптеру, чтобы он для отображения пунктов использовал layout-ресурс android.R.layout.simple_list_item_1, а данные вставлял в TextView с ID = android.R.id.text1. Вам просто надо нарисовать свой layout-ресурс и в нем настроить свой TextView и указать их адаптеру.Oleg_SS писал(а): Подозреваю, что шрифт зависит от этой строки:
SimpleCursorAdapter scAdapter = new SimpleCursorAdapter(
getBaseContext(), android.R.layout.simple_list_item_1, cursor,
new String[] { "title" }, new int[] { android.R.id.text1 });
Для меня это пока еще слишком сложно. Пошел по более простому пути. Простому в смысле понимания. У меня надо заполнить не лист, а спиннер. В цикле перебираю все записи курсора и добавляю в адаптер. А потом подключаю адаптер к спинеру.damager82 писал(а): Вам просто надо нарисовать свой layout-ресурс и в нем настроить свой TextView и указать их адаптеру.