音频的播放-播放应用资源文件、播放应用原始文件、播放外部存储器上的音频文件、播放来自网络的音频文件

目录

1.播放应用资源文件

2.播放应用原始文件

3.播放外部存储器上的音频文件

4.播放来自网络的音频文件


1.播放应用资源文件

可将音频文件放在/res/raw目录下,具体流程如下图所示:

 那怎么样使用该目录下面的资源呢?

界面布局:(下面的示例都使用该界面布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/test_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="点我播放"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

具体实现代码:

 //播放应用的资源文件
        MediaPlayer mediaPlayer = MediaPlayer.create(this,R.raw.ab);

        test_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mediaPlayer.start();
            }
        });

2.播放应用原始文件

可将音频文件放在src/main/assets目录下,通过AssetManager进行获取,具体流程如下图所示:

 具体实现代码:

 //播放应用的原始资源文件
        AssetManager assetManager = getAssets();
        AssetFileDescriptor afd = null;
        try {
            afd = assetManager.openFd("ab.mp3");
        } catch (IOException e) {
            e.printStackTrace();
        }
        MediaPlayer mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }


        test_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mediaPlayer.start();
            }
        });

 3.播放外部存储器上的音频文件

可通过打开虚拟机,打开到相应的目录,将桌面的音频文件拖入即可。

需要注意的是:需要在AndroidManifest进行文件读取的相关配置,同时还需要确保文件路径正确。若路径不对,则会报

                           E/MediaPlayerNative: start called in state 1, mPlayer(0x0)
                           error (-38, 0)
                           E/MediaPlayer: Error (-38,0)

配置具体如下:

<!--向SD卡写入数据的权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" />
 android:requestLegacyExternalStorage="true"

具体实现代码:(需将setDataSource中的路径改为自己存放的位置,可通过Andorid Studio右侧的Device File Explorer进行查看存放的位置)

 //播放外部存储器上的音频文件
       mediaPlayer = new MediaPlayer();
        try {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
                mediaPlayer.reset();
            }
            mediaPlayer.setDataSource("/sdcard/Download/ab.mp3");
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }

        test_btn.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onClick(View view) {
                mediaPlayer.start();
            }
        });

 4.播放来自网络的音频文件

在实现这种方式播放音频时我遇到了很多的问题,报错如下:

E/MediaPlayerNative: start called in state 0, mPlayer(0xc4a160c0)
E/MediaPlayerNative: error (-38, 0)

 一开始我以为是我找的音频播放不了的问题,然后之后我又换成了自己上传的视频进行使用,发现还是报一样的错误,之后才发现如果调用的是http需要在配置文件中进行配置才可以访问。加上了下面这个权限后即可正常播放。

android:usesCleartextTraffic="true"

具体代码如下:

 //播放来自网络的音频文件
        Uri uri = Uri.parse("写入音频的地址");
        MediaPlayer mediaPlayer = new MediaPlayer();
        try {
            mediaPlayer.setDataSource(this,uri);
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }

        test_btn.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onClick(View view) {
                mediaPlayer.start();
            }
        });

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值