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中注册辅助功能

<serviceandroid: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-dataandroid: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-servicexmlns: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;@Overridepublic 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;}}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {this.intent = intent;isPaymentReceivedClick = false;//重置return super.onStartCommand(intent, flags, startId);}@Overridepublic 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打开微信和支付宝付款码和扫一扫界面相关推荐

  1. 微信、支付宝付款码规则

    微信: 用户付款码条形码规则:18位纯数字,以10.11.12.13.14.15开头 支付宝: 25~30开头的长度为16~24位的数字,实际字符串长度以开发者获取的付款码长度为准

  2. 微信和支付宝付款码条码规则

    微信条码规则:用户付款码条形码规则:18位纯数字,以10.11.12.13.14.15开头 支付宝条码规则:付款码将由原来的28开头扩充到25-30开头,长度由原来的16-18位扩充到16-24位.

  3. Android强行进阶:为何大厂APP如微信、支付宝、淘宝、手Q等只适配了armeabi-v7a/armeabi?

    0. 前言 前几天啊,在公众号发了一篇文章<优化ApK大小之ABI Filters 和 APK split>,评论区收到了一些留言说,文章讲得不够深入,关于系统是如何选择不同abi下的so ...

  4. 现在都用微信,支付宝付款,没有现金,要是没有网络,该怎么办?

    只要手机能开机,即使没有现金,没有网络,同样可以用微信或者支付宝进行付款.其实支付宝和微信早已上线了离线支付功能,但是很多人并不了解而已. 下面我就给大家简单说一下,怎么使用离线支付功能,在紧急情况下 ...

  5. 小程序源码:仿各大APP种树微信小程序源码下载-简单快速上手

    这是一款仿各大APP的种树获取水果的一款微信小程序 可以对树浇水,杀虫,修剪等等 另外还有夺宝,更多小程序推荐 支持流量主模式等等 可以进行邀请好友加快树木的成长速度 小程序源码下载地址: 小程序源码 ...

  6. APP种树微信小程序源码下载-简单快速上手

    这是一款种树获取水果的一款微信小程序 可以对树浇水,杀虫,修剪等等 另外还有夺宝,更多小程序推荐 可以进行邀请好友加快树木的成长速度 下面是小编的演示图: 小程序源码下载地址:(已更新)APP种树微信 ...

  7. TP5.1实现支付宝线下收银(扫码枪扫描用户支付宝付款码支付)

    1.在支付宝开放平台创建账号,选取支付方式---当面付,若需要其他的也可以一并加入,申请审核通过后,该支付需要签约,点击签约,按流程签约即可. 2.在申请过程中,接口加签方式需要在支付宝生成钥匙工具里 ...

  8. 支付宝付款码支付以及退款流程代码

    支付宝付款码支付接入流程. 官方文档地址: 小程序文档 - 支付宝文档中心 接入前提: 去控制台申请appId.应用私钥.支付宝公钥(注意不是应该公钥).环境区分(有沙箱和正式环境区分) 代码贴图: ...

  9. Flutter 插件url_launcher简介及使用,打开外部浏览器,拨打电话,发送短信,打开微信,支付宝,qq等

    url_launcher 插件名称:url_launcher 使用Demo import 'package:flutter/material.dart'; import 'package:url_la ...

  10. Android H5页面调起微信和支付宝付款

    一.前提条件:后端已经生成了支付链接 微信是支持H5在非微信内核的浏览器调起支付的,只是流程很麻烦,需要企业账号申请才行,并且周期较长.微信官方开通说明 申请入口:登录商户平台–>产品中心–&g ...

最新文章

  1. 说说进程与线程的区别与联系
  2. LeetCode(69):x 的平方根
  3. php 父类中获取子类的名称,php – 在父类中获取子类的名称(静态上下文)
  4. 微服务架构:如何用十步解耦你的系统?
  5. ORACLE SQL功能优化系列(一)
  6. python(you-get):2分钟快速下载网站视频
  7. Latex + vscode + SumatraPdf配置的一些历程
  8. [质因数分解]樱花 洛谷P1445
  9. 网上关于'好人卡'的定义
  10. mybatis多表查询(一对多,多对一,多对多)
  11. PDF文件如何另存为
  12. golang使用os\exec执行高级命令
  13. win7 64位系统PSD缩略图补丁预览PSD Mystic Thumbs免费版
  14. 读书 | 可复制的领导力(内含思维导图)
  15. java 代码模板_请按模板要求,将【代码】替换为Java程序代码
  16. 正则验证——常用的正则表达式
  17. str.rsplit 拆分
  18. NPDP产品经理小知识-团队发展的五个阶段(塔克曼模型)
  19. 2000亿美元进口背后的“芯”之殇
  20. image unity 原始尺寸_unity获取Texture2D的原始大小

热门文章

  1. SpringBoot集成EasyExcel的使用
  2. spark学习系列——6 Historyserver配置
  3. 【ROS1】LeGO-LOAM-BOR简洁复现过程
  4. 关于Growth Hacker的笔记
  5. C++获取C盘临时文件夹的方法
  6. 交叉熵损失(Cross-entropy)和平方损失(MSE)究竟有何区别?
  7. jmeter手动添加cookie及线程间cookie共享的2种方法
  8. coffeescript_在客户端上使用CoffeeScript
  9. Unity3D场景对象无法显示
  10. leetcode | 回文数