代码之家  ›  专栏  ›  技术社区  ›  nburn42

在android上的报警频道播放声音

  •  3
  • nburn42  · 技术社区  · 8 年前

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

    我的目标是在报警频道上按需播放声音。
    (因此音量由报警音量设置调整)

    由此 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);
    }
    

    它仍然在音乐频道播放。 (即音量在音乐设置中调整而不是报警)

    我的直觉是我错过了一个许可什么的,但我没有找到这样的许可。

    我在谷歌Pixel1上测试

    谢谢,
    弥敦

    编辑:

    感谢@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();
    }
    
    2 回复  |  直到 8 年前
        1
  •  5
  •   Jeffrey Blattman    8 年前

    问题是 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
  •  2
  •   Andy Weinstein    7 年前

    上面我对Jeffrey Blattman的答案投了更高的票,但下面是完整的代码,它展示了如何将setDataSource与音频文件一起使用,并将其放入应用程序资源(RAW)。还有一些我在旅行中捡到的东西…

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