Uri uri = Uri.parse("alipayqr://platformapi/startapp?saId=10000007"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
Uri uri = Uri.parse("alipayqr://platformapi/startapp?saId=20000056"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
Intent intent = new Intent(); intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI")); intent.putExtra("LauncherUI.From.Scaner.Shortcut", true); intent.setFlags(335544320); intent.setAction("android.intent.action.VIEW"); startActivity(intent);
<service android:name=".PayAccessibility" android:enabled="true" android:exported="true" android:foregroundServiceType="location" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/pay_accessibility_config" /> </service>
<?xml version="1.0" encoding="utf-8"?> <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:accessibilityEventTypes="typeWindowStateChanged|typeViewFocused|typeViewClicked" android:accessibilityFeedbackType="feedbackGeneric" android:accessibilityFlags="flagDefault" android:canRetrieveWindowContent="true" android:canRequestFilterKeyEvents ="true" android:notificationTimeout="100" android:packageNames="@null" android:description="@string/accessibility_description"/>
package com.sanyesan.paymodel; import android.accessibilityservice.AccessibilityService; import android.content.ComponentName; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; /** * author :MrXie * date :2021/9/12 18:56 * description : */ public class PayAccessibility extends AccessibilityService { private static final String TAG = PayAccessibility.class.getSimpleName(); private Intent intent = null; private boolean isPaymentReceivedClick = false; @Override public void onAccessibilityEvent(AccessibilityEvent event) { int eventType = event.getEventType(); Log.d(TAG, "onAccessibilityEvent: 活动事件"+event.getEventType()); switch (eventType){ case AccessibilityEvent.TYPE_VIEW_CLICKED: break; case AccessibilityEvent.TYPE_VIEW_FOCUSED: break; case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: Log.d(TAG, "onAccessibilityEvent: 包名:"+event.getPackageName()); ComponentName componentName = new ComponentName(event.getPackageName() == null ? "" : event.getPackageName().toString(), event.getClassName() == null ? "" : event.getClassName().toString()); ActivityInfo activityInfo = tryGetActivity(componentName); if (event.getPackageName() != null && event.getPackageName().equals("com.tencent.mm")){ Log.d(TAG, "onAccessibilityEvent: 活动名:"+activityInfo); boolean isActivity = activityInfo != null; if(isActivity){ Log.d(TAG, "onAccessibilityEvent: 界面不为空"); if(TextUtils.equals("com.tencent.mm.ui.LauncherUI", activityInfo.name) && !isPaymentReceivedClick){ AccessibilityNodeInfo rootNode = getRootInActiveWindow(); if (rootNode != null) { pay:for (AccessibilityNodeInfo node : rootNode.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/fcu")) { Log.d(TAG, "onAccessibilityEvent: 下拉列表"); if (node.isEnabled() && TextUtils.equals(node.getClassName(), "android.widget.RelativeLayout")) { Log.d(TAG, "autoScreen: 自动点击"); node.performAction(AccessibilityNodeInfo.ACTION_CLICK); //睡眠一会,等待视图刷新 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } AccessibilityNodeInfo rootNodePayActivity = getRootInActiveWindow(); Log.d(TAG, "onAccessibilityEvent: rootNodePayActivity.size = "+rootNodePayActivity.getChildCount()); for (AccessibilityNodeInfo payNode : rootNodePayActivity.findAccessibilityNodeInfosByText("收付款")){//收付款按钮不可点击 Log.d(TAG, "onAccessibilityEvent: 进入首付款界面:"+payNode.getClassName()); if(payNode.isEnabled() && TextUtils.equals(payNode.getClassName(), "android.widget.TextView")){ Log.d(TAG, "onAccessibilityEvent: 点击收付款按钮"); payNode.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);//获取父级的控件 // stopSelf(); isPaymentReceivedClick = true; Log.d(TAG, "onAccessibilityEvent: 停止服务"); } } Log.d(TAG, "onAccessibilityEvent: 结束列表框遍历"); } } }else { Log.d(TAG, "autoScreen: 节点为空"); } } }else { Log.d(TAG, "onAccessibilityEvent: 界面为空"); } } break; case AccessibilityEvent.TYPE_WINDOWS_CHANGED: Log.d("EEE", "TYPE_WINDOWS_CHANGED: " + event.getPackageName() + " " + event.getClassName() + " " + event); break; } } /** * 获取Activity界面信息 * @param componentName * @return */ private ActivityInfo tryGetActivity(ComponentName componentName) { try { Log.d("EEE", "get appInfo:" + componentName.getPackageName()); return getPackageManager().getActivityInfo(componentName, 0); } catch (PackageManager.NameNotFoundException e) { return null; } } @Override public int onStartCommand(Intent intent, int flags, int startId) { this.intent = intent; isPaymentReceivedClick = false;//重置 return super.onStartCommand(intent, flags, startId); } @Override public void onInterrupt() { } }
最后,启动辅助功能并调用微信付款码
if(isAccessibilitySettingsOn(MainActivity2.this)){ Intent intent = new Intent(MainActivity2.this, PayAccessibility.class); startService(intent); new Handler(Looper.getMainLooper()).postDelayed(() -> { Intent intent1 = new Intent(); ComponentName cmp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI"); intent1.setAction(Intent.ACTION_MAIN); intent1.addCategory(Intent.CATEGORY_LAUNCHER); intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent1.setComponent(cmp); startActivity(intent1); }, 200); }else { startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)); finish(); }
注意:必须得增加辅助功能权限的判断
/** * 辅助服务是否开启 * * @param context 活动context * @return */ public static boolean isAccessibilitySettingsOn(Context context) { int accessibilityEnabled = 0; final String service = context.getPackageName() + "/" + PayAccessibility.class.getCanonicalName(); try { accessibilityEnabled = Settings.Secure.getInt(context.getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED); } catch (Settings.SettingNotFoundException e) { e.printStackTrace(); } TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':'); if (accessibilityEnabled == 1) { String settingValue = Settings.Secure.getString(context.getApplicationContext().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); if (settingValue != null) { mStringColonSplitter.setString(settingValue); while (mStringColonSplitter.hasNext()) { String accessibilityService = mStringColonSplitter.next(); if (accessibilityService.equalsIgnoreCase(service)) { return true; } } } } return false; }