Playing sound on the alarm channel on android

前端 未结 2 1385
余生分开走
余生分开走 2020-12-01 19:43

I have done a lot of googling but other\'s solutions are not working for me.

My goal is to play a sound on demand on the alarm channel.
(So the sound volume is a

相关标签:
2条回答
  • 2020-12-01 20:07

    The problem is that create() puts the MediaPlayer in a state where it won't accept the attributes (it calls prepare() for you). You need to use the more verbose mechanism of creating the player.

      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();
    
    0 讨论(0)
  • 2020-12-01 20:27

    I upvoted Jeffrey Blattman's answer above, but here is the full code that shows how to use setDataSource with an audio file that you put into your app resources (raw). Also a couple of other things I picked up in my travels...

    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();
    }
    
    0 讨论(0)
提交回复
热议问题