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中有两种Acvivityandroid.app.Activitydocs和android.support.v4.app.ActivityCompatdocs。

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的主要内容,如果未能解决你的问题,请参考以下文章