【问题标题】:Android MediaPlayer - how to play in the STREAM_ALARM?Android MediaPlayer - 如何在 STREAM_ALARM 中播放?
【发布时间】:2023-03-31 08:19:01
【问题描述】:

我尝试使用以下代码在我的应用程序中设置媒体播放器的音频流,但是当我这样做时,我在模拟器中听不到声音。如果我没有为播放器设置流,那么音频播放正常。我确定我用错了,但无法锻炼,有什么帮助吗?

MediaPlayer player = MediaPlayer.create(getApplicationContext(), R.raw.test_audio);

AudioManager audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.getStreamVolume(AudioManager.STREAM_ALARM);
audioManager.setStreamVolume(AudioManager.STREAM_ALARM, audioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM), AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
player.setAudioStreamType(AudioManager.STREAM_ALARM);
player.start();

注意:我已经在清单中添加了 MODIFY_AUDIO_SETTINGS 权限。

谢谢!

【问题讨论】:

    标签: android stream media-player android-audiomanager


    【解决方案1】:

    我不知道为什么会发生这种情况,但是下面的代码有效。您应该使用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();
    

    【讨论】:

    • 最好把uri写成:Uri.parse("android.resource://"+mContext.getPackageName()+"/"+R.raw.sound)
    【解决方案2】:

    问题是您使用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();
    

    更多信息请参见this link

    【讨论】:

      【解决方案3】:

      1。 setAudioStreamType(int streamtype)

      必须在prepare()之前调用这个方法;

      2。 MediaPlayer.create(Context context, int resid)

      如果成功,prepare() 将已经被调用并且不能再次调用。

      【讨论】:

        【解决方案4】:

        此处的解决方案已在 API 22 中弃用

        我打开了自己的thread 来解决这个问题。

        这是一个更新的工作解决方案。

        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();
        }
        

        【讨论】:

        • 找到了一种更简单的方法(SDK >= 21):MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.<sound>, new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).build(), audioManager.generateAudioSessionId());
        【解决方案5】:

        尝试以下方法:

        player.setAudioStreamType(AudioManager.STREAM_ALARM);
        player.prepare();
        player.start();
        

        为什么要调用“audioManager.getStreamVolume(AudioManager.STREAM_ALARM);”?该值未存储在变量中,因此它毫无用处;)

        希望对你有帮助

        【讨论】:

        • 我用 player.prepare() 尝试过,但没有任何区别。仍然没有播放音频。我将流音量存储到稍后在我的应用程序中使用的变量中,我暂时取出分配以帮助调试。
        猜你喜欢
        • 1970-01-01
        • 2017-12-29
        • 1970-01-01
        • 2011-08-10
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多