问题标签 [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.

0 投票
1 回答
1208 浏览

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) 

0 投票
1 回答
429 浏览

android - 当用户在android 6.0中一次请求多个权限时单击拒绝并选中复选框时如何处理

根据运行时权限文档,应用程序可以检查运行时权限并在尚未授予权限的情况下请求权限。所以我正在编写一个程序来一次处理运行时多个权限。当用户单击拒绝并选中“不再询问”复选框时,我做得正确但无法处理。在这种情况下,我想打开权限意图,如图 2 所示。当用户下次打开我的应用程序时。

当用户选中“不再询问”复选框并单击拒绝按钮时,我无法检测到这种情况。

在此处输入图像描述 在此处输入图像描述

这是我的代码:

0 投票
1 回答
698 浏览

android - 片段没有被破坏,但 onCreateView 被调用

我有一个Activity,它有ViewPager。这ViewPager使用. Fragments_ Adapter我的每个片段都被视为部分(根据应用功能)。最初我使用一次加载所有ViewPager项目,

viewPager.setOffscreenPageLimit(sectionList.size()); //sectionList is nothing but number of framgents

在片段中,我有一个在创建片段时setupAdapter类调用的函数。

调查片段

调查适配器

这里SectionView是一个由 class 扩展的抽象类SimpleSection。并在其中SimpleSection添加自定义视图。自定义视图大约有 20-30 个视图类。

到这里为止一切都很好。但是在某些我无法保留它的情况下,SectionView 会变为空。这是场景,

  1. 我有自定义相机实现,从片段我打开我的自定义相机(不破坏片段或活动),捕获图像,然后我回到片段onCreateView()有时被调用,所以sectionView是空的。当我调试时,没有调用任何生命周期方法(例如onDestroyView(), onDestroy(), onDetach(), onLowMemeory(), onConfigurationChanged())。那怎么onCreateView()叫呢?

  2. 在 Nexus 9 中,在更改运行时权限时发生了同样的情况。我将进入Fragment,向下滚动状态栏 > 转到设置 > 应用程序 > 应用程序权限 > 位置 > 撤销位置权限。如果我授予权限,它不会崩溃,但如果我撤销 sectionView 对象将为空

奇怪的行为:为了检查第二种情况,我连接了调试器以确保在撤销Location权限时片段/活动是否被破坏。一旦我撤销了位置权限,调试器就会断开连接并且应用程序被杀死/死亡。每当我撤销任何权限时都会发生这种情况。

现在如何确保sectionView对象被保留或不被销毁?

0 投票
0 回答
656 浏览

android - 当权限被撤销时,权限请求对话框在应用程序重新启动时仍然存在

我的应用程序针对 Android Marshmallow(API 级别 23),并按照以下链接中的开发人员指南实现了运行时权限。 https://developer.android.com/training/permissions/requesting.html。

这个请求权限模型工作正常。

当屏幕上弹出权限请求时,如果用户通过访问设置 -> 应用程序 -> 我的应用程序名称 -> 权限撤销已经授予的权限并切换到我的应用程序,则应用程序正在重新启动。但是已经打开的权限请求对话框仍然存在。

因此,请提出一些解决方案,以在重新启动时关闭屏幕中已经存在的权限请求对话框。

0 投票
1 回答
349 浏览

android - 运行时的 Android 权限与片段

我的项目中有一个活动,它在 xml(主)中有两个片段:

如您所见,其中之一是地图片段。问题是在setContentView()运行时,应用程序在 API 23 以上崩溃。我之前尝试setContentView()使用文档进行(位置)权限检查,但应用程序仍然崩溃。任何想法?

0 投票
0 回答
182 浏览

android - Android Marshmallow:撤销权限和 UI 测试

当从 Android Marshmallow 中的应用程序撤销权限(例如:位置)时,应用程序进程将终止。对于想要测试不同情况(启用/禁用权限)的 UI 测试,有什么方法可以处理这个问题?尝试使用 UIAutomator 在 App Setting 中设置权限会导致崩溃,因为该应用程序在权限被撤销后立即终止。感谢任何见解/评论!

0 投票
1 回答
4090 浏览

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

0 投票
1 回答
191 浏览

android - 请求服务应用程序崩溃的权限

我正在尝试请求

我收到此错误

请帮忙

0 投票
1 回答
5086 浏览

android - ContextCompat.checkSelfPermission(Context, Manifest.permission.CAMERA) 总是返回被授予

我在我的应用程序中使用 Android API lvl 23。当我检查相机权限时,ContextCompat.checkSelfPermission总是返回 0 ( == PackageManager.PERMISSION_GRANTED)

我设法将其从 更改ContextCompatActivityCompat

这是我的代码:

我在 Gradle 构建中的依赖项

更新:权限调用

0 投票
0 回答
561 浏览

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(); } }

和回调..