guodashen007 2024-03-06 22:09 采纳率: 75%
浏览 16
已结题

小米手机安卓14无障碍获取截屏权限

小米手机安卓14无障碍获取截屏权限,

 // 查找安装,并模拟点击(findAccessibilityNodeInfosByText判断逻辑是contains而非equals)
    private void findTxtClick(AccessibilityNodeInfo nodeInfo, String txt) {
        List<AccessibilityNodeInfo> nodes = nodeInfo.findAccessibilityNodeInfosByText(txt);
        Log.i(TAG, "findTxtClick: " + txt + ", " + nodes.size() + ", " + nodes);
        if (nodes == null || nodes.isEmpty()) {
            return;
        }
        Log.i(TAG, "findTxtClick: " + txt + ", " + nodes.size() + ", " + nodes);
        for (AccessibilityNodeInfo node : nodes) {
            node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
        }
    }

 List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = rootNode.findAccessibilityNodeInfosByViewId("android:id/button1");
                Log.i(TAG, "findTxtClick: 立即开始"   + ", " + findAccessibilityNodeInfosByViewId.size());
                if (findAccessibilityNodeInfosByViewId.size() > 0) {
                    System.out.println("5=====================" + findAccessibilityNodeInfosByViewId.size());
                    Iterator<AccessibilityNodeInfo> it = findAccessibilityNodeInfosByViewId.iterator();
                    while (it.hasNext()) {
                        it.next().performAction(16);
                    }
                    return;
                }

img

  Gesture(path, 50L, 0L);

这些都不管用,有能解决的价格好商量
  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-06 22:11
    关注

    引自免费微信小程序:皆我百晓生

    在小米手机安卓14系统中,无障碍服务(AccessibilityService)要获取截屏权限,并模拟用户操作进行自动点击“立即开始”等按钮以完成相关设置,您需要确保以下几点:

    1. 无障碍服务的配置:首先,在您的应用中创建一个继承自AccessibilityService的服务类,并在AndroidManifest.xml中进行相应的声明和配置。例如:
    <service android:name=".YourAccessibilityService">
        <intent-filter>
            <action android:name="android.accessibilityservice.AccessibilityService" />
        </intent-filter>
        <meta-data
            android:name="android.accessibilityservice"
            android:resource="@xml/accessibility_service_config" />
    </service>
    

    同时,还需要在res/xml/accessibility_service_config.xml中指定无障碍服务可以执行的动作和事件类型,例如:

    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:description="@string/accessibility_service_description"
        android:packageNames="com.miui.securitycenter"
        android:accessibilityEventTypes="typeAllMask"
        android:accessibilityFeedbackType="feedbackGeneric"
        android:canRetrieveWindowContent="true"
        android:notificationTimeout="100"
        android:settingsActivity="com.example.YourSettingsActivity" />
    
    1. 模拟点击操作:在无障碍服务的逻辑中,您尝试通过文本或View ID查找节点并模拟点击。针对“立即开始”按钮,您可以优化代码如下:
    public class YourAccessibilityService extends AccessibilityService {
        //...
        
        @Override
        public void onAccessibilityEvent(AccessibilityEvent event) {
            AccessibilityNodeInfo rootNode = getRootInActiveWindow();
            
            if (rootNode != null) {
                // 通过View ID查找节点
                List<AccessibilityNodeInfo> nodesById = rootNode.findAccessibilityNodeInfosByViewId("your_package_name:id/button_start");
                
                for (AccessibilityNodeInfo node : nodesById) {
                    if (node.isClickable()) {
                        node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                        break;
                    }
                }
                
                // 释放引用,避免内存泄漏
                AccessibilityNodeInfoCompatUtils.recycleNodes(nodesById);
            }
            
            // 若需要处理其他逻辑或截屏权限设置页面有变动,可以通过文本查找节点
            // findTxtClick(rootNode, "立即开始");
            
            // 释放根节点引用
            rootNode.recycle();
        }
    
        // 其他辅助方法...
    }
    
    1. 截屏权限申请: 在安卓14中,申请截屏权限不再属于无障碍服务范畴,而是需要在运行时请求普通权限(WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE)。不过,小米手机可能会有额外的安全隐私设定要求用户手动开启。
    // 请求存储权限用于保存截图
    private void requestStoragePermissions() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                    PERMISSION_REQUEST_STORAGE);
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_STORAGE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // 权限已授予,此时可以尝试截屏
                } else {
                    // 用户拒绝了权限,提示用户开启
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    
    1. 截屏功能实现: 使用系统的屏幕捕获功能或者自定义截图功能,具体实现会涉及调用MediaProjectionManager以及SurfaceControl等API。但请注意,由于安全性和隐私保护原因,无障碍服务可能无法直接截取某些敏感界面。

    对于小米手机特定的权限设置流程,如果上述无障碍服务仍无法自动完成截屏权限的获取,您可能需要引导用户手动进入设置页面进行相关权限的开启。在无障碍服务中,您可以尝试定位到相应设置项的界面元素并模拟点击,但这依赖于小米手机的具体UI结构和元素ID。若遇到难以解决的问题,请查阅小米官方文档或开发者社区的相关讨论。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 3月6日

悬赏问题

  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序
  • ¥15 多址通信方式的抗噪声性能和系统容量对比