这是错误代码 ,在虚拟机运行时崩溃,
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.add.mp3list, PID: 7193
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.add.mp3list/com.add.mp3list.MainActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=7193, uid=10090 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/audio/media from pid=7193, uid=10090 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()
at android.os.Parcel.readException(Parcel.java:1942)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
at android.content.ContentResolver.query(ContentResolver.java:754)
at android.content.ContentResolver.query(ContentResolver.java:704)
at android.content.ContentResolver.query(ContentResolver.java:662)
at com.add.mp3list.MusicList.getMusicData(MusicList.java:26)
at com.add.mp3list.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Application terminated.
1.首先检查你在AndroidManifest.xml中,是否已经配置了android.permission.READ_EXTERNAL_STORAGE这个权限, 没有的话加上下面这个:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2.然后查看你的SDK是不是大于23,如果大于23还需要动态申请权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(needPermissions, PERMISSON_REQUESTCODE);
}
needPermissions是你要申请的权限,PERMISSON_REQUESTCODE 是请求码自己定义用于回调的;具体·的你可以查下Android6.0动态权限了解。
3.确保权限获取后再次执行你后面的操作。
送你一个权限检查工具
public class PermissionUtil {
public static PermissionUtil.Builder build(Activity activity) {
return new Builder(activity);
}
public static class Builder {
private Activity mActivity;
private List<String> permissionList;
public Builder(@NonNull Activity activity) {
mActivity = activity;
permissionList = new ArrayList<>();
}
public Builder addPermission(@NonNull String permission) {
if (!permissionList.contains(permission)) {
permissionList.add(permission);
}
return this;
}
public List<String> checkPermission() {
List<String> list = new ArrayList<>();
for (String permission : permissionList) {
if (ActivityCompat.checkSelfPermission(mActivity, permission) != PackageManager.PERMISSION_GRANTED) {
list.add(permission);
}
}
if (list.size() > 0) {
ActivityCompat.requestPermissions(mActivity, list.toArray(new String[list.size()]), 1);
}
return list;
}
}
}
权限检查,权限申请,再执行。