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

Posted

技术标签:

【中文标题】媒体播放器文件未找到异常【英文标题】:Media Player File not found exception 【发布时间】:2018-08-09 06:11:08 【问题描述】:

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

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

我已检查以确保 mp3 位于正确的路径中,并且我已尝试在模拟的 Android 和我自己的手机上运行它,但我一直收到相同的错误。

这是我遇到问题的 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(权限被拒绝) 在 java.io.FileInputStream.open(本机方法) 在 java.io.FileInputStream.(FileInputStream.java:146) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1088) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1067) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1009) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:967) 在 android.media.MediaPlayer.create(MediaPlayer.java:874) 在 android.media.MediaPlayer.create(MediaPlayer.java:851) 在 android.media.MediaPlayer.create(MediaPlayer.java:830) 在 hn.mediaplayer.MainActivity.onCreate(MainActivity.java:48) 在 android.app.Activity.performCreate(Activity.java:6662) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6077) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

【问题讨论】:

是否在外部下载目录中? 【参考方案1】:

AndroidManifest.xml

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

并在 android 5.0 版本以上添加运行时权限

【讨论】:

【参考方案2】:

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

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

然后在你的活动中

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]);

【讨论】:

【参考方案3】:

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

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

从棉花糖及以上,您必须向用户请求Dangerous permission。

read doc for requesting runtime permission

【讨论】:

以上是关于媒体播放器文件未找到异常的主要内容,如果未能解决你的问题,请参考以下文章

姜戈。未找到媒体文件

monogame 内容加载文件未找到异常

找到媒体路由,但未显示媒体路由按钮

Apollo CM11 类未找到异常

Kurento媒体服务器抛出“处理方法时出现意外错误:未找到工厂'PlayerEndPoint''”

未找到媒体类型 = 应用程序/八位字节流的 MessageBodyReader