鄙人最近想开发一个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);