问题标签 [runtime-permissions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 拒绝并在运行时授予权限后在 Android 应用程序上获取 FileNotFoundException
我正在尝试让一个应用程序从 sd 卡播放 mp3。我正在使用 android sdk 版本 23,在 Windows 8 上使用 Android Studio。我在 nexus 5 模拟器上运行它。
我在运行时请求权限,如果我拒绝一次权限但在第二个请求上授予权限,我会收到 FileNotFoundException。如果我重新启动应用程序,我可以播放音乐文件,如果我在第一次尝试时接受许可请求,它也可以成功播放音乐,而无需重新启动。
我制作了一个简单的程序来复制问题并将其发布在github 上。您需要 /Music 目录中的 mp3 文件才能运行此应用程序。
这是我要求存储权限的代码:
这是失败的相关代码片段:
这是堆栈跟踪:
MediaPlayer:创建失败:java.io.FileNotFoundException:/storage/emulated/0/Music/108-radiohead-house of cards-pms.mp3:打开失败:libcore.io.IoBridge.open(IoBridge)的 EACCES(权限被拒绝) .java:452) 在 java.io.FileInputStream.(FileInputStream.java:76) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1095) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1074)在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1028) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:973) 在 android.media.MediaPlayer.create(MediaPlayer.java:880) 在 android。 media.MediaPlayer.create(MediaPlayer.java:857) 在 android.media.MediaPlayer.create(MediaPlayer.java:836) 在 gunboat.com.mediaplayererror.FullscreenActivity。playSong(FullscreenActivity.java:190) 在 gunboat.com.mediaplayererror.FullscreenActivity.CheckPermission(FullscreenActivity.java:135) 在 gunboat.com.mediaplayererror.FullscreenActivity.access$300(FullscreenActivity.java:24) 在 gunboat.com.mediaplayererror。 FullscreenActivity$5.onClick(FullscreenActivity.java:113) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android。 app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)引起:android.system.ErrnoException:打开失败:在libcore.io.Posix.open(本机方法)的EACCES(权限被拒绝)在 libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 在 libcore.io.IoBridge.open(IoBridge.java:438) 在 java.io.FileInputStream.(FileInputStream.java:76) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1028) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1074) 在 android.media.MediaPlayer.setDataSource(MediaPlayer.java:1095) 在 android. media.MediaPlayer.setDataSource(MediaPlayer.java:973) 在 android.media.MediaPlayer.create(MediaPlayer.java:880) 在 android.media.MediaPlayer.create(MediaPlayer.java:857) 在 android.media.MediaPlayer.create(MediaPlayer.java:836) 在 gunboat.com.mediaplayererror.FullscreenActivity.playSong(FullscreenActivity.java:190) 在 gunboat.com.mediaplayererror.FullscreenActivity.CheckPermission(FullscreenActivity.java:135 ) 在 gunboat.com.mediaplayererror.FullscreenActivity.access$300(FullscreenActivity.java:24) 在 gunboat.com.mediaplayererror.FullscreenActivity$5.onClick(FullscreenActivity.java:113) 在 android.view.View.performClick(View.java:5198) 在 android.view.View$PerformClick.run(View.java:21147) 在 android.os.Handler.handleCallback(Handler.java:739) 在android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417)5417)5417)5198) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.view.View$PerformClick.run(View.java:21147) 在android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417)5198) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.view.View$PerformClick.run(View.java:21147) 在android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5417)Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread .java:5417)Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread .java:5417)主要(ActivityThread.java:5417)主要(ActivityThread.java:5417)
android - 当用户在android 6.0中一次请求多个权限时单击拒绝并选中复选框时如何处理
根据运行时权限文档,应用程序可以检查运行时权限并在尚未授予权限的情况下请求权限。所以我正在编写一个程序来一次处理运行时多个权限。当用户单击拒绝并选中“不再询问”复选框时,我做得正确但无法处理。在这种情况下,我想打开权限意图,如图 2 所示。当用户下次打开我的应用程序时。
当用户选中“不再询问”复选框并单击拒绝按钮时,我无法检测到这种情况。
这是我的代码:
android - 片段没有被破坏,但 onCreateView 被调用
我有一个Activity
,它有ViewPager
。这ViewPager
使用. Fragments
_ Adapter
我的每个片段都被视为部分(根据应用功能)。最初我使用一次加载所有ViewPager
项目,
viewPager.setOffscreenPageLimit(sectionList.size()); //sectionList is nothing but number of framgents
在片段中,我有一个在创建片段时setup
从Adapter
类调用的函数。
调查片段
调查适配器
这里SectionView
是一个由 class 扩展的抽象类SimpleSection
。并在其中SimpleSection
添加自定义视图。自定义视图大约有 20-30 个视图类。
到这里为止一切都很好。但是在某些我无法保留它的情况下,SectionView 会变为空。这是场景,
我有自定义相机实现,从片段我打开我的自定义相机(不破坏片段或活动),捕获图像,然后我回到片段
onCreateView()
有时被调用,所以sectionView
是空的。当我调试时,没有调用任何生命周期方法(例如onDestroyView()
,onDestroy()
,onDetach()
,onLowMemeory()
,onConfigurationChanged()
)。那怎么onCreateView()
叫呢?在 Nexus 9 中,在更改运行时权限时发生了同样的情况。我将进入
Fragment
,向下滚动状态栏 > 转到设置 > 应用程序 > 应用程序权限 > 位置 > 撤销位置权限。如果我授予权限,它不会崩溃,但如果我撤销 sectionView 对象将为空
奇怪的行为:为了检查第二种情况,我连接了调试器以确保在撤销Location
权限时片段/活动是否被破坏。一旦我撤销了位置权限,调试器就会断开连接并且应用程序被杀死/死亡。每当我撤销任何权限时都会发生这种情况。
现在如何确保sectionView
对象被保留或不被销毁?
android - 当权限被撤销时,权限请求对话框在应用程序重新启动时仍然存在
我的应用程序针对 Android Marshmallow(API 级别 23),并按照以下链接中的开发人员指南实现了运行时权限。 https://developer.android.com/training/permissions/requesting.html。
这个请求权限模型工作正常。
当屏幕上弹出权限请求时,如果用户通过访问设置 -> 应用程序 -> 我的应用程序名称 -> 权限撤销已经授予的权限并切换到我的应用程序,则应用程序正在重新启动。但是已经打开的权限请求对话框仍然存在。
因此,请提出一些解决方案,以在重新启动时关闭屏幕中已经存在的权限请求对话框。
android - 运行时的 Android 权限与片段
我的项目中有一个活动,它在 xml(主)中有两个片段:
如您所见,其中之一是地图片段。问题是在setContentView()
运行时,应用程序在 API 23 以上崩溃。我之前尝试setContentView()
使用文档进行(位置)权限检查,但应用程序仍然崩溃。任何想法?
android - Android Marshmallow:撤销权限和 UI 测试
当从 Android Marshmallow 中的应用程序撤销权限(例如:位置)时,应用程序进程将终止。对于想要测试不同情况(启用/禁用权限)的 UI 测试,有什么方法可以处理这个问题?尝试使用 UIAutomator 在 App Setting 中设置权限会导致崩溃,因为该应用程序在权限被撤销后立即终止。感谢任何见解/评论!
android - 如何在 Android 6.0 上请求运行时录制权限?
从 Android 6.0 开始,我们需要在应用运行时请求权限。
在我的应用程序中,我使用本地存储、相机、地理位置和录音权限。
因此,可以使用该片段请求本地存储、相机和地理位置: https ://github.com/appcelerator-developer-relations/appc-sample-ti510/blob/master/app/controllers/permissions.js
但是我还没有找到如何请求录音权限...我实际上使用了适用于 Android 的titutorial.audiorecorder 模块,当我从 Android 6.0 开始尝试录制时它崩溃了,因为没有启用录制权限。
有关我的环境的更多信息:
tiapp.xml
android - 请求服务应用程序崩溃的权限
我正在尝试请求
我收到此错误
请帮忙
android - ContextCompat.checkSelfPermission(Context, Manifest.permission.CAMERA) 总是返回被授予
我在我的应用程序中使用 Android API lvl 23。当我检查相机权限时,ContextCompat.checkSelfPermission
总是返回 0 ( == PackageManager.PERMISSION_GRANTED
)
我设法将其从 更改ContextCompat
为ActivityCompat
。
这是我的代码:
我在 Gradle 构建中的依赖项
更新:权限调用
android-6.0-marshmallow - 用于从外部存储读取的 Android m 运行时权限
我有一个对话框,它加载带有 5 个部分的 tabLayout,它的内容是使用带有 View Pager 适配器的 ViewPager 加载的。现在,在其中一个部分中,我必须从图库中加载图像。我已经编写了运行时权限,但是我无法使用权限的回调,因为我在没有活动的类中实现了这个对话框。我不知道如何在无活动的类中实现权限的回调方法。
public void makePermissionRequest(){
if(ContextCompat.checkSelfPermission(showEditorActivity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(showEditorActivity,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, permission_request_code);
}else{
fetchImagesFromDevice();
}
}
和回调..