找不到媒体播放器文件异常

Media Player File not found exception

我正在编写一个基本的 android mp3 播放器应用程序,它使用 MediaPlayer 应用程序播放本地存储在 Android phone 上的 mp3 文件。

但是,每当我尝试调用 MediaPlayer.create() 时,我都会收到 java.io.FileNotFoundException

我已经检查以确保 mp3 位于正确的路径中,并且我已经在仿真 Android 和我自己的 phone 上尝试 运行 这个,但是我不断收到相同的错误。

这是我遇到问题的 onCreate 函数:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath() + 
       "/Download/sam_stone.mp3");

    med = MediaPlayer.create(getApplicationContext(), uri);
}

这是我遇到的错误:

java.io.FileNotFoundException: /storage/emulated/0/Download/sam_stone.mp3 (Permission denied) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.(FileInputStream.java:146) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1088) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1067) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1009) at android.media.MediaPlayer.setDataSource(MediaPlayer.java:967) at android.media.MediaPlayer.create(MediaPlayer.java:874) at android.media.MediaPlayer.create(MediaPlayer.java:851) at android.media.MediaPlayer.create(MediaPlayer.java:830) at hn.mediaplayer.MainActivity.onCreate(MainActivity.java:48) at android.app.Activity.performCreate(Activity.java:6662) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

AndroidManifest.xml

中添加权限
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

并在 android 版本 5.0

之上添加 运行 时间权限

您必须在清单中添加 READ_EXTERNAL_STORAGE 权限。

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

对于 marshmallow 及更高版本,您必须向用户请求 Dangerous permission

read doc for requesting runtime permission

首先你需要给AndiodManifest.xml文件添加权限

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

然后在你的 activity

public  boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
    if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED) {
        Log.v(TAG,"Permission is granted");
        return true;
    } else {

        Log.v(TAG,"Permission is revoked");
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        return false;
    }
}
else { 
    Log.v(TAG,"Permission is granted");
    return true;
}}

然后权限结果回调哪里可以恢复任务:

@Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions, 
 int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
    Log.v(TAG,"Permission: "+permissions[0]+ " "+grantResults[0]);
}}