ttyyd1 2024-07-25 23:56 采纳率: 0%
浏览 11
已结题

android开发 AccessibilityService跳转activity失败

鄙人最近想开发一个android记账app,实现自动记账。搜索了解到网上的做法是使用无障碍服务读取相关数据。我现在的想法是在微信账单详情界面长按,无障碍服务监听长按动作来触发添加账单的AddRecordActivity。目前已经实现了在微信的账单详情界面长按后能读取相关数据,但是没有办法跳转,尝试了网上的方法都不行。求解答!

public class ZhifuAccessibilityService extends AccessibilityService {
    private ArrayList<String> contentList = new ArrayList<>();

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
//监听到长按动作
   if( event.getEventType() == AccessibilityEvent.TYPE_VIEW_LONG_CLICKED ) {
            contentList.clear();
            AccessibilityNodeInfo source = event.getSource();
            if (source != null && containsText(source, "账单服务")) {
                Log.d("DEBUG","找到了账单服务");
                StringBuffer sb = new StringBuffer();
                for (int i = 0; i < contentList.size(); i++) {
                    sb.append(contentList.get(i) + ";");
                }
                Log.d("DEBUG",sb.toString());
//到这里都能正常实现。接下来想在微信账单详情界面跳转至我的app的AddRecordActivity就开始有问题了。

//                Intent intent = new Intent(getApplicationContext(), AddRecordActivity.class);
//                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 对于从服务启动Activity,这是必需的
//                this.startActivity(intent);


//                Intent it = new Intent("com.qylk.call.main");
//                it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                String a = AddRecordActivity.class.getPackage().getName();
//                String b =AddRecordActivity.class.getName();
//                Log.d("DEBUG","package:" + a +";class:" + b);
//                it.setClassName(AddRecordActivity.class.getPackage().getName(),AddRecordActivity.class.getName());
//                startActivity(it);

                Intent i = new Intent("com.qylk.call.main");
                i.addCategory(Intent.CATEGORY_DEFAULT);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);

            }
            if (source != null) {
                source.recycle(); // 回收节点资源
            }
            }

    }

    private boolean containsText(AccessibilityNodeInfo node, String targetText) {
        if (node == null) return false;

        // 检查当前节点的文本
        CharSequence text = node.getText();
        if(text!=null){
            contentList.add(text.toString());

        }
        if (text != null && text.toString().contains(targetText)) {
            return true;
        }

        // 遍历子节点
        for (int i = 0; i < node.getChildCount(); i++) {
            AccessibilityNodeInfo child = node.getChild(i);
            if (containsText(child, targetText)) {
                if (child != null){
                    child.recycle(); // 回收子节点资源
                }

                return true;
            }
            if(child!= null){
                child.recycle();
                // 无论是否找到,都回收子节点资源
            }

        }

        return false;
    }

    @Override
    public void onInterrupt() {
        // 当服务被中断时调用
    }

}

尝试过方法1 显式指定意图,但是logcat报错 android.content.ActivityNotFoundException,找不到,很离谱

//                Intent it = new Intent("com.qylk.call.main");
//                it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                String a = AddRecordActivity.class.getPackage().getName();
//                String b =AddRecordActivity.class.getName();
//                Log.d("DEBUG","package:" + a +";class:" + b);
//                it.setClassName(AddRecordActivity.class.getPackage().getName(),AddRecordActivity.class.getName());
//                startActivity(it);

我的manifest.xml是这样定义的

   <activity
            android:name=".ui.addRecord.AddRecordActivity"
            android:exported="true" >

        <intent-filter>

            <action android:name="com.qylk.call.main" />    <!-- 自定义的action-->

            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />

            <category android:name="android.intent.category.DEFAULT" /><!--必须加上这个,否则下面无法直接使用自定的action-->

        </intent-filter>
        </activity>

尝试方法2,隐式指定意图 logcat没报错,提示一个信息 Timeline: Activity_launch_request time:264296982,然后就没有然后了

                 Intent i = new Intent("com.qylk.call.main");
                i.addCategory(Intent.CATEGORY_DEFAULT);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);
  • 写回答

3条回答 默认 最新

  • ttyyd1 2024-07-26 00:16
    关注

    已解决 原来是小米手机 要开启后台弹出权限

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月26日
  • 创建了问题 7月25日