找不到媒体播放器文件异常
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。
首先你需要给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]);
}}
我正在编写一个基本的 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。
首先你需要给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]);
}}