【问题标题】:Playing sound on the alarm channel on android在android的报警通道上播放声音
【发布时间】:2018-06-15 19:37:38
【问题描述】:

我已经做了很多谷歌搜索,但其他的解决方案对我不起作用。

我的目标是在报警频道上按需播放声音。
(所以音量是通过闹钟音量设置来调节的)

从这个thread 我构建了以下代码

mediaPlayerScan = MediaPlayer.create(getContext(), 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);
}

它仍在音乐频道上播放。 (IE音量是在音乐设置里调节的,不是闹铃)

我的直觉是我缺少一个权限或其他东西,但我没有找到这样的权限。

我在 Google Pixel 1 上进行测试

谢谢,
内森

编辑:

感谢@jeffery-blattman,下面的代码对我有用

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

【问题讨论】:

  • 这可能在主线程上有问题 - 对 mediaPlayerScan.start() 的调用在哪里?我在下面发布了包含所有详细信息的答案。你做 setDataSource 的方式也不错,但请告诉我们 R.string.res_path 是什么样子的!

标签: android


【解决方案1】:

问题在于create()MediaPlayer 置于不接受属性的状态(它为您调用prepare())。您需要使用更详细的机制来创建播放器。

  final MediaPlayer mediaPlayer = new MediaPlayer();
  mediaPlayer.setDataSource(...);

  AudioAttributes attrs = new AudioAttributes.Builder().setUsage(usage).build();
  mediaPlayer.setAudioAttributes(attrs);

  new AsyncTask<Void,Void,Boolean>() {
    @Override
    protected Boolean doInBackground(Void... voids) {
      try {
        mediaPlayer.prepare();
        return true;
      } catch (IOException e) {
        e.printStackTrace();
      }
      return false;
    }

    @Override
    protected void onPostExecute(Boolean prepared) {
      if (prepared) {
          mediaPlayer.start();
      }
    }
  }.execute();

【讨论】:

  • 这里有什么用法
【解决方案2】:

我赞成 Jeffrey Blattman 的上述回答,但这里是完整的代码,展示了如何将 setDataSource 与您放入应用资源(原始)的音频文件一起使用。还有一些我在旅行中捡到的其他东西......

static public void playAlarmSound () {
    final MediaPlayer mediaPlayer = new MediaPlayer();
    new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... voids) {
            try {
                mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        mediaPlayer.reset();
                        mediaPlayer.release();
                    }
                });
                mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                    @Override
                    public void onPrepared(MediaPlayer mp) {
                        mediaPlayer.start();
                    }
                });
                AssetFileDescriptor afd = getContext().getResources().openRawResourceFd(R.raw.nameofyourresource);
                if (afd == null) return false;
                mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                afd.close();

                if (Build.VERSION.SDK_INT >= 21) {
                    mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
                            .setUsage(AudioAttributes.USAGE_ALARM)
                            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                            .build());
                } else {
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
                }
                mediaPlayer.setVolume(1.0f, 1.0f);
                mediaPlayer.prepare();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }

    }.execute();
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多