Activity.requestPermissions与ActivityCompat.requestPermissions的区别

6

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

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


  • What is the difference between

    Activity.requestPermissions(permissions, requestCode)
    

    and

    ActivityCompat.requestPermissions(activity, permissions, requestCode)
    
  • Which one should I use?

2个回答

6
这会在更低版本中显示运行时权限请求对话框吗?
不会。在较低版本中没有这样的对话框。它只是调用您的onRequestPermissionsResult()方法,告诉您持有权限(因为根据定义,您已经持有权限)。
什么是Activity#requestPermissions()ActivityCompat.requestPermissions()之间的区别? Activity#requestPermissions()适用于minSdkVersion为23或更高版本的应用程序,或者适用于开发人员喜欢调用if (Build.VERSION.SDK_INT>= 23) 在旧设备上避免该调用的应用程序。 ActivityCompat.requestPermissions()适用于任何应用程序,在所有支持的API级别(返回到API Level 14 IIRC)上"做正确的事情"。
我应该使用哪一个?
如果您的minSdkVersion为23或更高版本,请随意使用Activity#requestPermissions()。否则,我建议您使用ActivityCompat.requestPermissions()

如果我使用ActivityCompat.requestPermissions()并且设备的版本是6.0或更高,那么运行时权限对话框会弹出吗? - Roshana Pitigala
@RoshanaPitigala:是的,假设用户没有在权限请求中点击“不再询问”。ActivityCompat.requestPermissions() 只是检查 Build.VERSION.SDK_INT,如果设备运行Android 6.0+,则调用Activity#requestPermissions(),否则具有回退行为。 - CommonsWare
所以我认为,ActivityCompat.requestPermissions()只是一种懒惰的方式;来摆脱另一个检查 if(Build.VERSION.SDK_INT >= 23) - Roshana Pitigala
1
@RoshanaPitigala:这是一种省事的方式,可以避免编写另一个SDK_INT检查,并记住要检查的版本号。 - CommonsWare
实际上并不是这样的。ActivityCompat.requestPermissions() 用于 ActivityCompat 类型的活动中,而 Activity.requestPermissions(permissions, requestCode) 用于 Activity 类型的活动中。我的回答有更多相关信息。 - ItIsEntropy
1
@Pure-Entropy:ActivityCompat 不需要 AppCompatActivity - CommonsWare

1
它的存在是因为在Android中有两种类型的Activity,即android.app.Activitydocs和android.support.v4.app.ActivityCompatdocs。Activity适用于最小SDK版本为14 iirc的设备,而ActivityCompat适用于向后兼容(SDK 9及以上)。它允许您访问可支持的新功能和材料主题,而不会引入任何破坏性变化,这些变化是新操作系统版本引入的,以实现新功能和UI。对于低版本的Android,此代码部分实际上被忽略了。不会显示运行时权限请求对话框。 Android 6.0是首次显示运行时权限对话框的版本。

我该使用哪一个?

这完全取决于你使用的Activity类型。如果你的活动是Activity的子类,则使用Activity.requestPermissions(permissions, requestCode)。但是,如果你正在使用ActivityCompat的子类,则应使用ActivityCompat.requestPermissions(activity, permissions, requestCode)


ActivityCompat 不是一个 Activity。请参见:https://developer.android.com/reference/androidx/core/app/ActivityCompat。 - CommonsWare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接