READ_EXTERNAL_STORAGE 在23之上的权限获取 在两个app上同样的申请 不同的结果 why

网上所有的信息都显示 在api>=23 权限需要动态申请,

READ_EXTERNAL_STORAGE

可是目前手头上有两个app, 一个直接在Androidmanifest上定义就直接有了权限, 如A

另一个在Androidmanifest 申请后,23之下可以申请到权限,23之上就不能申请到权限 B


是个好的问题


进一步定位问题:

将A中 READ_EXTERNAL_STORAGE删掉依然可以获取到权限,这可就奇怪了,看了下 另一个和External_storage相关的权限是WRITE_EXTERNAL_STORAGE, 如有write权限自然读的权限就有了,所以将A中write 权限删掉,果然 没有权限了。看来问题出在 WRITE_EXTERNAL_STORAGE上。

可是我B上也申请了WRITE_EXTERNAL_STORAGE呀。

问题调研继续进行中


调研完毕,虽然结果我不想承认 是因为targetSdkVersion的原因


在A里 是22 即6.0之下, B是25 


在我的认识中:

targetSdkVersion 是最优适配的api版本,即所有框架层代码都是以 targetSdkVersion的版本的方法为标准,如果此app装进api 16/25的机器,那16/25中方法名相同但功能不同的功能以targetSdkVersion的方法为准。可是权限的自动申请和动态申请是以app装的机器有关。但是明显,此次的问题颠覆了我根深蒂固觉得认识很清楚的知识点,但是这就是学习过程。


那么真实的targetSdkVersion 到底是什么呢?


targetSdkVersion 是Android系统提供向前兼容的主要手段。随着Android系统的升级,某个系统的api或模块的行为可能会发生改变,但是为了保证Apk的行为和以前API相同,所以设置targetSdkVersion,只要targetSDKVersion不变,及时apk安装在新的Android系统上,其行为还是保持老的系统上的行为,这样就保证了系统对老应用的向前兼容(感觉和我的理解一样呀)


那类似这种需要手动的权限我们都改了target偏小一点就能避开 听起来像个bug 而且主要APi方法改动也不是很大 那是不是targetSdkVersion偏小一点更好??

那也不一定,如果targetSdkVersion小的话 那么23的新特性也就没了

发布了23 篇原创文章 · 获赞 0 · 访问量 1万+
展开阅读全文

关于Android的错误:Permission Denial: 。。。.READ_EXTERNAL_STORAGE, or grantUriPermission(

10-11

这是错误代码 ,在虚拟机运行时崩溃, 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. 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览