player.setAudioAttributes(AudioManager.STREAM_MUSIC);为什么报错
时间: 2024-03-24 16:35:41 浏览: 14
`setAudioAttributes`方法的参数是一个`AudioAttributes`对象,而不是一个整数值。因此,您需要先创建一个`AudioAttributes`对象,然后将其传递给`setAudioAttributes`方法。以下是一个示例:
```java
AudioAttributes attrs = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
player.setAudioAttributes(attrs);
```
在上面的示例中,我们通过`AudioAttributes.Builder`创建了一个包含音频用途和内容类型的`AudioAttributes`对象,并将其传递给`setAudioAttributes`方法。您可以根据自己的需求更改用途和内容类型。
相关问题
public void play(String path){ Log.d(TAG,"play"); try{ player.reset(); player.setDataSource(path); AudioAttributes attrs = new AudioAttributes.Builder() .setLegacyStreamType(AudioManager.STREAM_MUSIC) .build(); player.setAudioAttributes(attrs); //player.setAudioAttributes(AudioManager.STREAM_MUSIC); player.prepareAsync(); player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { player.start(); addTimer(); } });改怎么修改
您可以将 `setAudioAttributes` 方法注释掉,然后使用 `setAudioStreamType` 方法来设置音频流的类型,如下所示:
```
public void play(String path) {
Log.d(TAG, "play");
try {
player.reset();
player.setDataSource(path);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepareAsync();
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
player.start();
addTimer();
}
});
}
// ...
}
```
请注意,`setAudioStreamType` 方法已经被标记为过时,但是在较旧的 Android 版本上仍然可以使用。如果您的应用程序目标为 Android 26 及更高版本,则需要使用 `setAudioAttributes` 方法来设置音频属性。
IjkMediaPlayer.setDataSource播放raw文件夹内文件
你可以使用以下代码来使用IjkMediaPlayer播放raw文件夹内的文件:
```java
import android.content.res.AssetFileDescriptor;
import android.content.res.Resources;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import java.io.IOException;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, MediaPlayer.OnPreparedListener {
private SurfaceView mSurfaceView;
private IjkMediaPlayer mMediaPlayer;
private SurfaceHolder mSurfaceHolder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化IjkMediaPlayer
IjkMediaPlayer.loadLibrariesOnce(null);
IjkMediaPlayer.native_profileBegin("libijkplayer.so");
mSurfaceView = findViewById(R.id.surface_view);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 设置MediaPlayer
mMediaPlayer = new IjkMediaPlayer();
mMediaPlayer.setDisplay(mSurfaceHolder);
// 获取音频焦点
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
// 播放raw文件夹内的文件
Resources resources = getResources();
AssetFileDescriptor afd = resources.openRawResourceFd(R.raw.test);
try {
mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
} catch (IOException e) {
e.printStackTrace();
}
// 准备播放
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepareAsync();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// 释放MediaPlayer
mMediaPlayer.release();
mMediaPlayer = null;
}
@Override
public void onPrepared(MediaPlayer mp) {
// 开始播放
mMediaPlayer.start();
}
}
```
注意,这里使用了IjkMediaPlayer而不是Android自带的MediaPlayer,因为IjkMediaPlayer支持更多的视频格式,并且在播放过程中能够实时调整画面大小和速度等参数。同时,需要在项目的build.gradle文件中添加以下依赖:
```groovy
dependencies {
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
}
```