ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用自己的APP打开微信和支付宝付款码和扫一扫界面

2021-09-18 22:32:55  阅读:300  来源: 互联网

标签:支付宝 Log 微信 APP TAG Intent intent android event


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;
}

标签:支付宝,Log,微信,APP,TAG,Intent,intent,android,event
来源: https://blog.csdn.net/qq_44023485/article/details/120374463

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有