Android 11 无法播放assetManager中的mp3解决方案
介绍
在Android 11中,由于隐私权限的更新,访问外部存储的方式发生了变化。由于这个变化,导致了之前使用assetManager播放mp3文件的方法无法正常工作。本文将介绍如何解决这个问题,并提供详细的实现步骤和示例代码。
解决方案概述
为了实现播放assetManager中的mp3文件,我们需要将文件从asset目录复制到应用的私有目录中,然后再进行播放。下面是整个解决方案的步骤概述:
- 创建一个AudioPlayer类,用于处理音频播放逻辑。
- 在AndroidManifest.xml文件中添加适当的权限和配置。
- 创建一个Utility类,用于复制asset文件到应用的私有目录。
- 在Activity中实例化AudioPlayer并调用相应的方法。
下面我们将详细介绍每一步需要做什么,以及需要使用的代码和注释。
步骤1:创建AudioPlayer类
public class AudioPlayer {
private MediaPlayer mediaPlayer;
public void playAudio(Context context, String audioPath) {
// 创建MediaPlayer实例
mediaPlayer = new MediaPlayer();
try {
// 设置数据源为指定路径的文件
mediaPlayer.setDataSource(audioPath);
// 准备播放
mediaPlayer.prepareAsync();
// 设置准备完成的监听器
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 开始播放
mediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
public void stopAudio() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
// 停止播放
mediaPlayer.stop();
// 释放MediaPlayer资源
mediaPlayer.release();
mediaPlayer = null;
}
}
}
以上代码创建了一个AudioPlayer类,其中包含playAudio()方法用于播放音频文件,stopAudio()方法用于停止播放。需要注意的是,该类使用MediaPlayer来实现音频播放功能。
步骤2:修改AndroidManifest.xml
在AndroidManifest.xml文件中添加以下代码:
<manifest xmlns:android="
package="com.example.myapplication">
<!-- 添加以下权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
...
<!-- 添加以下配置 -->
android:requestLegacyExternalStorage="true">
...
</application>
</manifest>
以上代码添加了读取和写入外部存储的权限,并通过android:requestLegacyExternalStorage="true"
配置保持向后兼容性。
步骤3:创建Utility类
public class FileUtil {
public static void copyAssetToStorage(Context context, String assetFileName, String destFilePath) {
try {
InputStream inputStream = context.getAssets().open(assetFileName);
OutputStream outputStream = new FileOutputStream(destFilePath);
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
outputStream.write(buffer, 0, length);
}
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上代码创建了一个FileUtil类,其中包含copyAssetToStorage()方法,用于将asset文件复制到指定路径。
步骤4:在Activity中使用AudioPlayer
public class MainActivity extends AppCompatActivity {
private AudioPlayer audioPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 实例化AudioPlayer
audioPlayer = new AudioPlayer();
// 复制asset文件到应用私有目录
String audioPath = getFilesDir() + "/audio.mp3";
FileUtil.copyAssetToStorage(this, "audio.mp3", audioPath);
// 播放音频文件
audioPlayer.playAudio(this, audioPath);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 停止播放并释放资源
audioPlayer.stopAudio();
}
}
以上代码在MainActivity中实例化了AudioPlayer,并在onCreate()方法中调用了playAudio()方法来播放音频文件