setDataSource Failed 问题

setDataSource Failed 问题

有关于安卓MediaPlayer出现setDataSource Failed问题;
原始的代码如下:

String str = musicList.get(position).getUrl();
try {
     mediaPlayer.setDataSource(str );
     mediaPlayer.prepare();
 }catch (Exception e){
     e.printStackTrace();
 }
 if(!mediaPlayer.isPlaying()) {
     mediaPlayer.start();
 }
}

musicList存放着手机里歌曲的信息,按道理来说mediaPlayer.setDataSource(str );就应该可以得到当前歌曲的路径但是结果手机无反应,出现 setDataSource Failed

1.首先确定手机是否给了权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

以及

if(ContextCompat.checkSelfPermission(MusicActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE
    ) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(MusicActivity.this, new String[]{Manifest
        .permission.WRITE_EXTERNAL_STORAGE}, 1);
    }else {
        initMediaPlayer();
    }

    if(ContextCompat.checkSelfPermission(MusicActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE
    ) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(MusicActivity.this, new String[]{Manifest
                .permission.READ_EXTERNAL_STORAGE}, 2);
    }else {
        initMediaPlayer();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode){
        case 1:
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                initMediaPlayer();
            }else {
                Toast.makeText(this, "没有权限授权", Toast.LENGTH_SHORT).show();
            }
        case 2:
            if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                initMediaPlayer();
            }else {
                Toast.makeText(this, "没有权限授权", Toast.LENGTH_SHORT).show();
            }
            break;
            default:
    }
}

2.如果给了那么就是路径的问题 我们这样访问得到的路径 str 格式是/storage/emulated/0/…
这并不是文件的真实路径我们需要把前面的**/storage/emulated/0**替换为 /sdcard这样路径才是真实路径所以我们应该这样修改

String str = musicList.get(position).getUrl();
   String[] dataStr = str.split("/");
   String fileTruePath = "/sdcard";
   for(int i=4;i<dataStr.length;i++){
       fileTruePath = fileTruePath+"/"+dataStr[i];
   }
   try {
    mediaPlayer.setDataSource(fileTruePath );
    mediaPlayer.prepare();
}catch (Exception e){
    e.printStackTrace();
}

这样得到的fileTruePath 才是真实路径可以对文件进行操作;

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值