当前位置: 首页 > 知识库问答 >
问题:

Android:检查是否必须询问运行时权限

孙清野
2023-03-14

我想检查一个特定的应用程序是否需要在运行时处理Android Marshmallow运行时权限。

以下假设正确吗?

/**
 * Checks whether runtime permissions must be handled or not.
 *
 * @param context Application context.
 * @return Handle runtime permissions or not.
 */
public static boolean shouldCheckRuntimePermissions(Context context) {
    return
            isApplicationWithMarshmallowTargetSdkVersion(context) &&
                    Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}

/**
 * Checks whether the app is compiled with targetSdkVersion Marshmallow or above.
 *
 * @param context Application context.
 * @return Application targetSdkVersion above 23 or not.
 */
public static boolean isApplicationWithMarshmallowTargetSdkVersion(Context context) {
    return
            context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M;
}

下面是我详细阐述的表格,例如,向具有Android Marshmallow运行时权限的用户请求权限时,需要使用权限。

====================
target SDK |<23| 23|
====================
       |<23| X | X |
       ------------| 
OS SDK |23 | X | V |
====================   

我知道支持库助手的存在,但我想在这种特殊情况下避免使用它们。

共有3个答案

房泉
2023-03-14

您可以尝试使用Google示例中的EasyPermissions库。它处理与权限相关的检查,您无需担心版本的检查。

刘昌翰
2023-03-14

I您的活动检查是否(API版本

if (android.os.Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_DENIED) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_LOCATION_PERMISSION);
}

要从用户那里获得结果,只需覆盖

 @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_LOCATION_PERMISSION:
             if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.d(TAG,"Premission granted");
             }else {
                    Log.d(TAG,"Premission denied");
             }
             break;
    }
}
阎德义
2023-03-14

@LuisMiguelSierra是对的,我在问题末尾发布的链接中找到了答案,但我完全没有意识到。以下引用回答了我的问题,并证实了我的假设和方法是正确的:

在所有版本的Android上,您的应用程序都需要在其应用程序清单中声明所需的正常权限和危险权限,如声明权限中所述。但是,该声明的效果因系统版本和应用程序的目标SDK级别而异:

  • 如果设备运行的是Android 5.1或更低版本,或者您的应用程序的目标SDK为22或更低版本:如果您在清单中列出了危险权限,则用户在安装应用程序时必须授予该权限;如果他们不授予权限,则系统根本不会安装该应用程序

因此,关于何时请求权限的假设得到了确认:

====================
target SDK |<23| 23|
====================
       |<23| X | X |
       ------------| 
OS SDK |23 | X | V |
====================
 类似资料:
  • 问题内容: 我正在使用以下命令运行远程命令: 现在,我想获取输出。我看过这样的事情: 但这有时似乎永远不会运行(即使应该在stdout上有数据)。对我而言,这似乎意味着stdout.channel.exit_status_ready()为True时,stdout.channel.recv_ready()不一定已经准备好(正确)。 这样合适吗? 也就是说,在等待说数据准备就绪之前,我真的必须首先检查

  • 假设我试图将位图图像保存为png 如果我使用Android 6.0及以上版本,我需要请求运行时权限 我有几个问题: 上面的代码成功地请求了权限,但是我不得不重新启动应用程序,我如何恰当地暂停代码直到权限被授予或未被授予? 在 Android 6.0 下方,权限由清单文件在安装时授予。Android 5 或更低版本如何处理运行时权限代码? 谢谢

  • 根据以下内容:http://developer.android.com/preview/features/runtime-permissions.html#编码应用程序可以检查运行时权限,并在尚未授予权限的情况下请求权限。这时将显示以下对话框: 如果用户拒绝了一个重要的权限,imo一个应用程序应该显示一个解释,为什么需要这个权限,以及拒绝有什么影响。该对话框有两个选项: 重试(再次请求权限) 拒绝

  • 问题内容: 我在我的项目中使用JobService。运行良好。但有时服务停止了。它不会再次重新启动。因此,如果没有运行,我将尝试分层JobService。但是我不知道如何检查JobService是否已经运行。请让我知道如何检查JobService是否正在运行。 我的工作服务课程: 我的实用程序类: 开始: 停止: 问题答案: 我找到了解决方案。 使用此方法,我们可以检查jobService是否正在

  • 我想检查某个程序是否在计算机启动时运行,我为此访问了类: 输出确实是,因为该程序实际上是在windows启动时运行的,但是当我通过禁用该程序启动时(它的状态变为),下次我运行上面的代码时,结果仍然是,尽管该程序不再是启动程序的一部分。 这让我得出了一个简单的结论,当windows任务管理器禁用启动程序时,它不会删除注册表项中的项,而是更改了它的另一个值..但是我无法找到那个更改的值。 我希望有人能