ISO / IEC 9899: 6.7.2.1 / 10
Реализация может выделить любой адресный блок хранения, достаточно большой для хранения бит-поля. Если остается достаточно места, бит-поле, которое сразу же следует за другим битовым полем в структуре, должно быть упаковано в соседние биты того же блока. Если остается недостаточное пространство, то будет ли бит-поле, которое не подходит, помещается в следующий блок или перекрывает смежные единицы, это определяется реализацией. Порядок распределения бит-полей в пределах единицы (от высокого порядка до младшего или низкого порядка) определяется реализацией.
Безопаснее использовать операции смены битов вместо того, чтобы делать какие-либо предположения о упорядочении или выравнивании битового поля при попытке написать переносимый код независимо от системы endianness или bitity.
Также см. EXP11-C. Не применяйте операторов, ожидающих одного типа, к данным несовместимого типа .
Я не знаю, почему это произойдет, однако приведенный ниже код работает. Вы должны установить источник данных с помощью setDataSource()
вместо create()
.
Этот код работает:
MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setDataSource(this,Uri.parse("android.resource://PACKAGE_NAME/"+R.raw.soundfile));
mp.prepare();
mp.start();
Этот код не работа:
MediaPlayer mp = MediaPlayer.create(this, R.raw.soundfile);
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.prepare();
mp.start();
Попробуйте следующее:
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.prepare();
player.start();
И почему вы вызываете «audioManager.getStreamVolume (AudioManager.STREAM_ALARM);»? Значение не сохраняется в переменной, поэтому оно бесполезно;)
Надеюсь, что это помогло
Должен вызывать этот метод перед подготовкой ();
2. MediaPlayer.create (контекст контекста, int остаток)
При успехе, prepare () уже был вызван и не должен быть вызван снова.
Проблема в том, что вы используете MediaPlayer.create()
для создания MediaPlayer. Функция Create
вызывает функцию prepare()
, которая завершает работу вашего носителя и не позволяет вам изменять AudioStreamType
.
Решение использует setDataSource
вместо create
:
MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
try {
mp.setDataSource(getApplicationContext(), yourAudioUri);
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mp.start();
Для получения дополнительной информации см. эту ссылку .
Решение здесь устарело в API 22
. Я открыл свой собственный поток , чтобы понять это.
Вот обновленное рабочее решение.
mediaPlayerScan = new MediaPlayer();
try {
mediaPlayerScan.setDataSource(getContext(),
Uri.parse(getString(R.string.res_path) + R.raw.scan_beep));
if (Build.VERSION.SDK_INT >= 21) {
mediaPlayerScan.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build());
} else {
mediaPlayerScan.setAudioStreamType(AudioManager.STREAM_ALARM);
}
mediaPlayerScan.prepare();
} catch (IOException e) {
e.printStackTrace();
}
Uri.parse("android.resource://"+mContext.getPackageName()+"/"+R.raw.sound)
– Amir Hossein Ghasemi 18 August 2016 в 16:21