Это статический метод, который я использую в своих проектах. Я добавляю его в свой класс Utils:
public static void playSound(final Context context, final SoundType type)
{
new Thread(new Runnable()
{
@Override
public void run()
{
MediaPlayer mediaPlayer = new MediaPlayer();
int resId = -1;
switch (type)
{
case INCOMING_NOTIFICATION:
resId=R.raw.noti_sound;
break;
case SEND_BETTING_SLIP:
resId=R.raw.slip_sent;
break;
case TRIVIA_RIGHT_ANSWER:
resId=R.raw.game_bonus;
break;
case TRIVIA_WRONG_ANSWER:
resId=R.raw.whistle_referee_trivia_bad_answer;
break;
}
if (resId != -1)
{
mediaPlayer = MediaPlayer.create(context, resId);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setLooping(false);
mediaPlayer.start();
while (mediaPlayer.isPlaying() == true)
{
}
}
}
}).start();
}
}
, теперь я определяю Enum (SoundType) и помещаю mp3-файлы в папку raw в папку res.
Да, и другие функции имеют ту же проблему "отмывания констант" (например, strchr, strstr, все такое).
Именно по этой причине C ++ добавляет перегрузки (21.4: 4 ): сигнатура функции strchr (const char *, int)
заменяется двумя объявлениями:
const char* strchr(const char* s, int c);
char* strchr( char* s, int c);
Но, конечно, в C вы не можете иметь обе версии с одинаковым именем, корректные с константой, поэтому вы получите компромисс с неверной константой.
В C ++ не упоминаются аналогичные перегрузки для strtol и strtod, и, действительно, в моем компиляторе (GCC) их нет. Не знаю, почему нет: тот факт, что вы не можете неявно преобразовать char **
в const char **
(вместе с отсутствием перегрузки), объясняет это для C, но я не совсем понимаю, что было бы не так с перегрузкой C ++:
Используйте android.intent.action.MEDIA_MOUNTED вместо android.content.Intent.ACTION_MEDIA_MOUNTED
Вам также необходимо установить схему данных как "файл".
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file" />
</intent-filter>
Ссылка: поток разработчиков Android