Activity.requestPermissions 对比 ActivityCompat.requestPermissions

Activity.requestPermissions vs ActivityCompat.requestPermissions

运行时权限对话框显示在 Android 6.0 或更高版本中,因此 API 级别 23 中添加的 Activity.requestPermissions(...) 有意义。

但是为什么Android 6.0以下还有一个(ActivityCompat.requestPermissions(...))?这会在较低版本中显示运行时权限请求对话框吗?


Does this show runtime permission request dialog in lower versions?

没有。低版本没有这样的对话框。它只会调用您的 onRequestPermissionsResult() 方法让您知道您拥有权限(因为根据定义,您已经拥有)。

What is the difference between

Activity#requestPermissions() 适用于 minSdkVersion 为 23 或更高的应用,或者适用于开发人员喜欢调用 if (Build.VERSION.SDK_INT >= 23) 以避免在旧设备上调用该调用的应用。

ActivityCompat.requestPermissions() 适用于任何应用程序,因为它 "does the right thing" 在所有支持的 API 级别上(回到 API 级别 14 IIRC)。

Which one should I use?

如果您的 minSdkVersion 为 23 或更高,请随意使用 Activity#requestPermissions()。否则,我推荐ActivityCompat.requestPermissions()

But why is there another one (ActivityCompat.requestPermissions(...)) to be used for below Android 6.0?

存在是因为Android、android.app.Activitydocs, and android.support.v4.app.ActivityCompatdocs

中有两种Acvivity
  • Activity用于最低SDK版本为14 iirc
  • 的设备
  • ActivityCompat 是为了向后兼容(SDK 9 及更高版本)。它允许您访问可支持的新功能和 Material 主题,而无需任何新 OS 版本为实现新功能和 UI.
  • 而引入的重大更改。

Does this show runtime permission request dialog in lower versions?

没有。 Android 6.0 是第一个显示运行时权限对话框的版本,因此 Android 的早期版本无法显示它们。 OS iirc 的早期版本实际上忽略了这段代码。

Which one should I use?

这完全取决于您使用的 Activity 类型。如果您的 activity 是 Activity 的 child,则使用 Activity.requestPermissions(permissions, requestCode)。但是,如果您使用 ActivityCompat 的 child,请使用 ActivityCompat.requestPermissions(activity, permissions, requestCode).