有没有办法以编程方式对 Android 上的系统权限对话框执行输入操作?
Posted
技术标签:
【中文标题】有没有办法以编程方式对 Android 上的系统权限对话框执行输入操作?【英文标题】:Is there a way to programmatically perform input action on system permission dialogs on Android? 【发布时间】:2021-09-09 20:32:45 【问题描述】:此请求针对产品的特定用例
假设我将一个 AccessibilityService 实例化为我的应用程序上下文的一部分:我需要持续捕获屏幕内容,为此我正在使用附加到我的应用程序的 MediaProjectionManager。这是可行的,但需要注意的是:每次我重新启动设备或应用程序时,都必须对 MediaProjection 实例发出新请求,从而强制用户接受屏幕捕获系统权限对话框。
我正在尝试为用户跳过此步骤。我已经实现了自动触发对话请求。但是为了接受对话框提示,这是我尝试过的:
-
记录视图层次结构并找到对应的nodeViewId
对话框接受按钮。问题:AccessibilityService 没有提供
该系统对话框的 event.source。
使用 AccessibilityService.dispatchGesture 执行点击操作
在对话框的“立即开始”按钮的坐标上,在
系统显示它。
// PermissionAutomator
permissionsAutomator.listener = object : PermissionsAutomator.Listener
override fun onPerformClickOnCoordinate()
val clickPath = Path()
clickPath.moveTo(604F, 737F)
val clickStroke = StrokeDescription(clickPath, 0, 1)
val clickBuilder = GestureDescription.Builder()
clickBuilder.addStroke(clickStroke)
val gesture = clickBuilder.build()
val callback = object : GestureResultCallback()
override fun onCompleted(gestureDescription: GestureDescription)
super.onCompleted(gestureDescription)
Timber.d("gesture onCompleted")
override fun onCancelled(gestureDescription: GestureDescription)
super.onCancelled(gestureDescription)
Timber.d("gesture onCancelled")
dispatchGesture(gesture, callback, null)
有人对这个问题有什么建议吗?也许该解决方案可以针对 android 上的每个系统权限对话框进行扩展。谢谢!
System permission dialog for MediaProjection
【问题讨论】:
您的意思是要跳过截屏权限对话框吗? 【参考方案1】:看着MediaProjectionManager
https://developer.android.com/reference/android/media/projection/MediaProjectionManager
似乎每次都内置询问。它不是像READ_EXTERNAL_STORAGE
这样保存的常规权限。我看到的唯一方法是自己制作,因为 MediaProjectionManager
和 MediaProjection
是 final
如果可能的话,它必须从头开始。
【讨论】:
由于它不是常规权限并且系统每次都要求它,我试图找到一种方法来“跳过”每次用户重新启动应用程序时手动授予权限的过程或设备。 我明白了,但MediaProjectionManager
不会为您提供MediaProjection
,否则它是流程的一部分。您可以使用Reflection
或一些字节码操作库来双向传递MediaProjectionManager
的finality
并破坏请求,使其永远不会显示,并且无论权限如何,您都可以调用getMediaProjection
。以上是关于有没有办法以编程方式对 Android 上的系统权限对话框执行输入操作?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 Windows 上的 C++ 中以编程方式设置环境路径?
有没有办法以编程方式检测 Android 应用程序的 UI 组件?