Android 辅助功能 -抢红包

Android 辅助功能 -抢红包

本篇文章主要介绍下通过android辅助功能的方式来实现类似抢红包的功能.

1:权限声明

<uses-permission
    android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"
    tools:ignore="ProtectedPermissions" />

2: 配置信息

xml目录下创建如下文件:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:canRequestFilterKeyEvents="true"
    android:description="@string/desc"
    android:packageNames= "com.test.redpacket">
</accessibility-service>
  1. android:accessibilityEventTypes 定义服务要监听的事件类型
  2. android:accessibilityFeedbackType 定义了服务的反馈类型
  3. android:accessibilityFlags 定义服务的行为标志
  4. android:description 描述信息 (需要使用资源文件配置)
  5. android:canRetrieveWindowContent 定义了服务是否可以获取窗口内容
  6. android:packageNames定义了监听的包名

3: 自定义AccessibilityService

具体的代码如下:

public class RedPacketAccessibilityService extends AccessibilityService {
    private static final String TAG = "RedPacketAccessibilityService";

    @SuppressLint("LongLogTag")
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        int action = event.getAction();
        Log.i(TAG, "onAccessibilityEvent: " + action);
        CharSequence packageName = event.getPackageName();
        Log.i(TAG, "onAccessibilityEvent: " + packageName);
        AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow();
        if (rootInActiveWindow != null) {
            List<AccessibilityNodeInfo> nodeInfos = rootInActiveWindow.findAccessibilityNodeInfosByText("红包:恭喜发财");
            if (nodeInfos != null) {
                for (AccessibilityNodeInfo nodeInfo : nodeInfos) {
                    nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
            }
        }

    }

    @Override
    public void onInterrupt() {

    }
}
  1. AccessibilityNodeInfo:用于表示应用程序界面中的可访问节点。它提供了一系列方法来获取节点的信息,包括节点的文本、描述、可点击状态等. 可通过 getRootInActiveWindow()获取。
  2. findAccessibilityNodeInfosByText:通过文本内容查找匹配的可访问性节点信息。该方法会返回一个AccessibilityNodeInfo对象的列表,可以通过遍历列表来获取每个节点的详细信息
  3. nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK)用于执行点击操作,模拟用户点击。

4: 服务声明

在manifest.xml中声明服务.

<service
    android:name=".RedPacketAccessibilityService"
    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/acc" />
</service>

5: 测试代码

public class MainActivity extends AppCompatActivity {
    private Button btnSend;
    private TextView tvMsg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnSend=findViewById(R.id.btn_send);
        tvMsg=findViewById(R.id.tv_msg);
        Intent serviceIntent = new Intent(this, RedPacketAccessibilityService.class);
        startService(serviceIntent);
        btnSend.setOnClickListener(v -> {
            tvMsg.setText("红包:恭喜发财");
        });
        tvMsg.setOnClickListener(v -> {
            tvMsg.setText("消息展示");
            Toast.makeText(MainActivity.this,"抢红包",Toast.LENGTH_SHORT).show();
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值