【问题标题】:How to PROPERLY check android permission dynamically如何正确动态检查android权限
【发布时间】:2013-08-25 22:26:40
【问题描述】:

选择题:

以下哪项可以正确检查应用程序是否具有在其 AndroidManifest.xml 中声明的特定权限?

getContext().checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED

getContext().getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, getContext().getPackageName()) == PackageManager.PERMISSION_GRANTED

基本上,我对checkCallingOrSelfPermission 声称的 android 文档感到害怕 -> 如果您只是检查它,它会授予 IPC 权限?那有什么意思? http://developer.android.com/reference/android/content/Context.html#checkCallingOrSelfPermission(java.lang.String)

所以任何关于真正差异的解释都会很棒:D

*注意:我在库中提供此代码,因此我只能在运行时检查权限,除非您知道更好的方法。

【问题讨论】:

    标签: android permissions package android-manifest android-context


    【解决方案1】:

    你可以使用这个方法:

    //for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE"
    public boolean hasPermission(String permission) 
    {
        try {
            PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
            if (info.requestedPermissions != null) {
                for (String p : info.requestedPermissions) {
                    if (p.equals(permission)) {
                        return true;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    

    【讨论】:

    【解决方案2】:

    根据我的理解(这可能是错误的,因为我还没有过多地使用 IPC):

    鉴于您的代码是从另一个应用程序执行的(例如,您的库没有编译到应用程序中,而是使用Binder 或类似的东西暴露给第三方),您可以使用checkCallingPermission 来检查第三方是否派对应用程序具有给定的权限,而checkCallingOrSelfPermission 包括来自您的库编译到的应用程序的权限。

    您需要单独处理调用者的权限,因为在检查自己的权限时也可能将权限泄漏给其他应用程序。来自security tips

    不要泄露受权限保护的数据。当您的应用程序发生这种情况 通过 IPC 公开数据,因为它具有特定的 许可,但不需要任何客户的许可 是IPC接口。

    [...]

    如果提供的接口确实需要访问控制,请使用 checkCallingPermission() 验证调用者是否有需要 允许。在访问服务之前,这一点尤其重要 代表调用者,因为您的应用程序的标识被传递给 其他接口。

    您描述的包管理器方式检查您的库编译到的应用程序的权限。

    因此,如果您的代码不是从另一个进程执行的,您可能不必关心差异。否则,如果您对 是否可以执行任务感兴趣,请使用包管理器方式或 clear the calling identity stuff;如果您想检查调用进程是否也可以执行任务,请另外检查调用者的权限。

    【讨论】:

      【解决方案3】:

      您可以为此使用Context.checkCallingorSelfPermission() 函数。这是一个例子

      private boolean checkWriteExternalPermission()
      {
      
          String permission = "android.permission.WRITE_EXTERNAL_STORAGE";
          int res = getContext().checkCallingOrSelfPermission(permission);
          return (res == PackageManager.PERMISSION_GRANTED);            
      }
      

      【讨论】:

        猜你喜欢
        • 2012-05-10
        • 2016-07-22
        • 2016-10-04
        • 2017-09-26
        • 2017-03-18
        • 2017-07-15
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多