Android中动态权限的用例

Android中动态权限的用例,android,Android,我试图理解Android中动态权限的一些用例是什么。换句话说,我试图理解为什么我们有addPermission*()API方法,为什么仅仅拥有静态权限是不够的。似乎没有太多的材料来解释这一点,所以我希望得到一些解释 另外,为了了解应用程序如何使用动态权限,我下载了一些Android应用程序,并开始对它们进行反向工程,并在源代码中查找addPermission*()API方法。我注意到有一些应用程序实现了PackageManager的包装器类,我想知道这样做的目的是什么。下面是这些应用程序实现的包

我试图理解Android中动态权限的一些用例是什么。换句话说,我试图理解为什么我们有addPermission*()API方法,为什么仅仅拥有静态权限是不够的。似乎没有太多的材料来解释这一点,所以我希望得到一些解释

另外,为了了解应用程序如何使用动态权限,我下载了一些Android应用程序,并开始对它们进行反向工程,并在源代码中查找addPermission*()API方法。我注意到有一些应用程序实现了PackageManager的包装器类,我想知道这样做的目的是什么。下面是这些应用程序实现的包装器类的示例,它们所做的只是调用PackageManager类的相应方法:

public class PackageManagerWrapper
  extends PackageManager
{
  protected PackageManager mInner;

  public PackageManagerWrapper()
  {
    this.mInner = null;
  }

  public PackageManagerWrapper(Context paramContext)
  {
    this.mInner = paramContext.getPackageManager();
  }

  @Inject
  public PackageManagerWrapper(PackageManager paramPackageManager)
  {
    this.mInner = paramPackageManager;
  }

  public void addPackageToPreferred(String paramString)
  {
    this.mInner.addPackageToPreferred(paramString);
  }

  public boolean addPermission(PermissionInfo paramPermissionInfo)
  {
    return this.mInner.addPermission(paramPermissionInfo);
  }
...
}

非常感谢

应用程序可以定义自定义权限以保护其代码/数据,但仍允许其他应用程序(具有正确权限)使用它。虽然很容易想到用例——比如一套应用程序只需要在它们之间共享数据/功能,但这些都可以通过在清单中使用
标记来实现。但是,此API仅用于创建任何其他应用程序尚未使用的权限:

在安装任何使用这些权限的.apk之前,必须添加新权限。通过此方法添加的权限将在设备重新启动时被记住。如果给定的权限已经存在,您在此处提供的信息将用于更新它

但仍然意味着任何在其清单中声明a的应用程序都可以使用

因此,由于它在运行时创建权限,因此不能应用于自己的活动/服务,因此只剩下广播。与在清单中声明这些权限相比,这个API的唯一优点是用户不需要更新应用程序。因此,如果你有一套应用程序,只有一个“主”应用程序(类似于Google Play),并且即使用户没有更新你的应用程序,你也希望能够安全地向这套应用程序中的新应用程序广播,那么你仍然可以通过网络获得更新,并添加与新应用程序通信所需的权限


对于你的第二个问题,它不能从你的例子中扣除。可能有几个原因,比如充当或为了添加自定义功能。

好的,但是为什么您认为它是一个公开可用的API?对于第二个问题,包装器类似乎只是调用PackageManager类的方法,而没有真正添加任何功能。Android操作系统非常模块化,很多你认为“OS”的是应用程序(例如,启动程序)。很自然,这些应用程序只能使用公共Java方法。其中一些应用程序需要执行感官操作,所以Android权限模型只允许那些“系统应用程序”使用它的一些API。因此,这个api甚至可能不能被非系统应用程序使用,或者它是无用的,但是如果不能安装软件包(只能由系统应用程序完成),对于第二个问题,桥接模式允许您将来灵活使用,或者在第三方库中更好地处理将来的更改,即使不添加功能。但这只是一个猜测,你需要问问图书馆的创建者为什么要包装它:)非常感谢你的回答。我当然知道你是从哪里来的,但是addPermission*()API没有被标记为“@SystemApi”或“@hide”这一事实让我觉得它们是故意公开暴露给所有应用的。