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 才是真实路径可以对文件进行操作;