要实现不获得系统音频焦点播放视频(仅播放视频而无音频),同时不停止后台音乐,可以使用MediaPlayer和AudioManager类来控制音频焦点。以下是一个示例代码:
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener {
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private MediaPlayer mMediaPlayer;
private AudioManager mAudioManager;
private boolean mAudioFocusGranted = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSurfaceView = findViewById(R.id.surfaceView);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnPreparedListener(this);
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mMediaPlayer.setDisplay(holder);
playVideo("YOUR_VIDEO_URI");
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mMediaPlayer.release();
}
@Override
public void onPrepared(MediaPlayer mp) {
if (mAudioFocusGranted) {
mp.start();
}
}
private void playVideo(String videoUri) {
try {
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setDataSource(this, Uri.parse(videoUri));
mMediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
private void requestAudioFocus() {
AudioManager.OnAudioFocusChangeListener focusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
}
};
int result = mAudioManager.requestAudioFocus(focusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
mAudioFocusGranted = true;
}
}
private void abandonAudioFocus() {
mAudioManager.abandonAudioFocus(null);
mAudioFocusGranted = false;
}
@Override
protected void onResume() {
super.onResume();
requestAudioFocus();
}
@Override
protected void onPause() {
super.onPause();
abandonAudioFocus();
mMediaPlayer.pause();
}
}
请注意替换示例代码中的YOUR_VIDEO_URI
为实际视频的URI。此代码中的playVideo
方法使用MediaPlayer
类播放视频,并在准备完成后开始播放视频。requestAudioFocus
方法请求音频焦点,abandonAudioFocus
方法放弃音频焦点。在onResume
方法中请求音频焦点,在onPause
方法中放弃音频焦点并暂停视频播放。