有没有办法以编程方式对 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 这样保存的常规权限。我看到的唯一方法是自己制作,因为 MediaProjectionManagerMediaProjectionfinal 如果可能的话,它必须从头开始。

【讨论】:

由于它不是常规权限并且系统每次都要求它,我试图找到一种方法来“跳过”每次用户重新启动应用程序时手动授予权限的过程或设备。 我明白了,但MediaProjectionManager 不会为您提供MediaProjection,否则它是流程的一部分。您可以使用Reflection 或一些字节码操作库来双向传递MediaProjectionManagerfinality 并破坏请求,使其永远不会显示,并且无论权限如何,您都可以调用getMediaProjection

以上是关于有没有办法以编程方式对 Android 上的系统权限对话框执行输入操作?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法以编程方式启用 POP

有没有办法在 Windows 上的 C++ 中以编程方式设置环境路径?

有没有办法以编程方式检测 Android 应用程序的 UI 组件?

有没有办法以编程方式区分 IntelliJ IDEA 和 Android Studio [重复]

Android:以编程方式启用/禁用应用小部件

有没有办法通过 iOS/swift 中的蓝牙以编程方式连接 android 和 IOS 设备?