Android11 无法播放assetManager 中的mp3
  A1QNTrwhpnVP 2023年12月08日 24 0

Android 11 无法播放assetManager中的mp3解决方案

介绍

在Android 11中,由于隐私权限的更新,访问外部存储的方式发生了变化。由于这个变化,导致了之前使用assetManager播放mp3文件的方法无法正常工作。本文将介绍如何解决这个问题,并提供详细的实现步骤和示例代码。

解决方案概述

为了实现播放assetManager中的mp3文件,我们需要将文件从asset目录复制到应用的私有目录中,然后再进行播放。下面是整个解决方案的步骤概述:

  1. 创建一个AudioPlayer类,用于处理音频播放逻辑。
  2. 在AndroidManifest.xml文件中添加适当的权限和配置。
  3. 创建一个Utility类,用于复制asset文件到应用的私有目录。
  4. 在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()方法来播放音频文件

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月08日 0

暂无评论

A1QNTrwhpnVP