用自己的APP打开微信和支付宝付款码和扫一扫界面
2021/9/18 23:09:26
本文主要是介绍用自己的APP打开微信和支付宝付款码和扫一扫界面,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.调用支付宝扫一扫界面:
Uri uri = Uri.parse("alipayqr://platformapi/startapp?saId=10000007"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
2.调用支付宝收款码界面:
Uri uri = Uri.parse("alipayqr://platformapi/startapp?saId=20000056"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);
3.调用微信扫一扫界面:
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);
4.调用微信收款码,这里需要使用辅助功能实现
1.在AndroidMainfest.xml中注册辅助功能
<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>
2.在res下的xml配置服务config, 即pay_accessibility_config
<?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"/>
3.辅助功能具体实现
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; }
这篇关于用自己的APP打开微信和支付宝付款码和扫一扫界面的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)