Activity.requestPermissions 与 ActivityCompat.requestPermissions
Posted
技术标签:
【中文标题】Activity.requestPermissions 与 ActivityCompat.requestPermissions【英文标题】:Activity.requestPermissions vs ActivityCompat.requestPermissions 【发布时间】:2019-11-07 16:57:24 【问题描述】:运行时权限对话框显示在 android 6.0 或更高版本中,因此在 API 级别 23 中添加的Activity.requestPermissions(...)
有意义。
但是为什么还有一个 (ActivityCompat.requestPermissions(...)
) 用于 Android 6.0 以下?这会在较低版本中显示运行时权限请求对话框吗?
有什么区别
Activity.requestPermissions(permissions, requestCode)
和
ActivityCompat.requestPermissions(activity, permissions, requestCode)
我应该使用哪一个?
【问题讨论】:
【参考方案1】:这会在较低版本中显示运行时权限请求对话框吗?
没有。低版本没有这样的对话框。它会简单地调用您的onRequestPermissionsResult()
方法,让您知道您拥有权限(因为根据定义,您已经拥有)。
有什么区别
Activity#requestPermissions()
适用于 minSdkVersion
为 23 或更高的应用,或者适用于开发者喜欢调用 if (Build.VERSION.SDK_INT >= 23)
以避免在旧设备上调用的应用。
ActivityCompat.requestPermissions()
适用于任何应用程序,因为它在所有受支持的 API 级别(返回 API 级别 14 IIRC)上“做正确的事”。
我应该使用哪一个?
如果您的 minSdkVersion
为 23 或更高,请随意使用 Activity#requestPermissions()
。否则,我推荐ActivityCompat.requestPermissions()
。
【讨论】:
如果我使用ActivityCompat.requestPermissions()
并且设备是6.0或更高版本,是否会弹出运行时权限对话框?
@RoshanaPitigala:是的,假设用户没有点击“不再询问”以获得该权限。所有ActivityCompat.requestPermissions()
所做的只是检查Build.VERSION.SDK_INT
并在设备运行Android 6.0+ 时调用Activity#requestPermissions()
,如果不是,则使用回退行为。
所以我认为,ActivityCompat.requestPermissions()
只是一种懒惰的方式;摆脱再次检查if(Build.VERSION.SDK_INT >= 23)
@RoshanaPitigala:跳过编写另一个SDK_INT
检查以及记住要检查的版本号是一种懒惰的方式。
@Pure-Entropy: ActivityCompat
不需要AppCompatActivity
。【参考方案2】:
但是为什么还有一个 (ActivityCompat.requestPermissions(...)) 用于 Android 6.0 以下?
它的存在是因为Android中有两种Acvivity
,android.app.Activity
docs和android.support.v4.app.ActivityCompat
docs。
Activity
用于最低 SDK 版本为 14 iirc 的设备
ActivityCompat
用于向后兼容(SDK 9 及更高版本)。它允许您访问受支持的新功能和 Material 主题,而无需为实现新功能和 UI 而引入新操作系统版本所引入的任何重大更改。
这会在较低版本中显示运行时权限请求对话框吗?
没有。 Android 6.0 是第一个显示运行时权限对话框的版本,因此之前的 Android 版本无法显示它们。以前版本的操作系统 iirc 实际上忽略了那段代码。
我应该使用哪一个?
这完全取决于您使用的是哪种类型的Activity
。如果您的活动是Activity
的子活动,则使用Activity.requestPermissions(permissions, requestCode)
。但是,如果您使用的是ActivityCompat
的孩子,请使用ActivityCompat.requestPermissions(activity, permissions, requestCode)
。
【讨论】:
ActivityCompat
不是Activity
。请参阅:developer.android.com/reference/androidx/core/app/…。以上是关于Activity.requestPermissions 与 ActivityCompat.requestPermissions的主要内容,如果未能解决你的问题,请参考以下文章