Android: ActivityCompat.requestPermissions需要activity而不是context :/

9

我正在调用ActivityCompat.requestPermissions来获取Android M下的权限,但是这需要在参数中传入一个活动。虽然这样很好,但是我想从单例中调用它,而且单例可以被应用程序中的任何活动使用。

ActivityCompat.requestPermissions(context, PERMISSIONS_LOCATION, REQUEST_LOCATION);

我希望避免在单例中持有任何活动的引用,因为这是导致内存泄漏的可靠方法,而且我更喜欢单例根本不持有活动,因为所有调用它的活动都需要无用的代码(每个活动都必须在getInstance()中包含一个额外的参数,以便单例可以持有活动 - 单例需要从某个地方获取活动)。
现在,我可以技术上获取一个活动,然后在请求权限后立即将其设置为null,但这仍然会使我在每个调用单例的活动中留下大量无用的活动参数。是否有更优雅的解决方案,我只是没有看到?

如果您确定上下文变量持有对活动的引用,那么在需要时实际上可以将上下文转换为活动。 - Bhargav
@Bhargav 我正在使用getApplicationContext()作为我的上下文,以避免从活动中传递上下文。我猜我不能将其强制转换为活动? - Jon
1
查看 Runtime 请求的示例,请访问此链接:https://github.com/googlesamples/android-RuntimePermissions/blob/master/Application/src/main/java/com/example/android/system/runtimepermissions/MainActivity.java。 - dhun
@dhun - 谢谢,但有趣的是那正是我一开始用来构建我的代码的确切方法。它对我并不起作用,因为在示例中他是从一个活动中调用它,而我是从单例中调用它 - 这正是我的问题所在。 - Jon
1
没错,但是目标活动必须通过才能决定在哪里显示请求权限的对话框。 - dhun
显示剩余3条评论
1个回答

10

requestPermissions的文档说明activity参数是你想要在其中显示弹出窗口的目标活动,如果你没有在清单中包含权限,为此,该方法要求你传递一个活动而不是上下文,因为完成请求权限任务后,它将返回结果给调用活动(即作为方法参数传递的活动)。如果您坚决要通过单例实现此功能,我建议您创建一个函数,接受活动和回调作为参数,因为如果权限被授予或未授予,则需要处理回调。


2
好的,那很有道理。我之前想不明白为什么他们要求一个活动开始。我猜我只能从每个调用应用程序的类中传递活动引用 :/ - Jon

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