flutter如何实现给其他app自动填写

在Flutter中如何实现自动给其他应用填写表单的功能?比如自动填充账号密码到第三方APP的输入框中。需要用到哪些插件或原生交互方法?iOS和Android的实现方式是否有差异?能否提供具体的代码示例或实现思路?

2 回复

Flutter可通过flutter_local_autofill插件或平台通道调用原生API实现自动填写。需在Android和iOS端分别配置自动填充服务,并声明支持的字段类型。

更多关于flutter如何实现给其他app自动填写的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中实现自动填写其他应用的功能,主要通过Android的Accessibility Service(无障碍服务) 实现。以下是实现步骤和示例代码:

实现原理

利用无障碍服务模拟用户操作,自动填写其他应用的输入框。

步骤

  1. 创建Android无障碍服务
  2. 配置无障碍服务权限
  3. 在Flutter中调用原生代码

1. 创建Android无障碍服务

android/app/src/main/java/.../ 目录下创建 AutoFillService.java

public class AutoFillService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // 监听事件,例如窗口状态变化
    }

    @Override
    public void onInterrupt() {
        // 服务中断处理
    }

    public void autoFill(String text) {
        // 查找输入框并填写
        AccessibilityNodeInfo rootNode = getRootInActiveWindow();
        if (rootNode == null) return;

        List<AccessibilityNodeInfo> editFields = rootNode.findAccessibilityNodeInfosByViewId("目标应用输入框ID");
        for (AccessibilityNodeInfo field : editFields) {
            if (field.isEditable()) {
                Bundle arguments = new Bundle();
                arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
                field.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
            }
        }
    }
}

2. 配置服务

android/app/src/main/AndroidManifest.xml 中添加:

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

创建 android/app/src/main/res/xml/accessibility_service_config.xml

<accessibility-service xmlns:android="http://schemas.android.org/apk/res/android"
    android:description="@string/accessibility_service_description"
    android:packageNames="目标应用包名"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true" />

3. Flutter调用原生代码

通过 method_channel 调用Android代码:

Flutter端:

import 'package:flutter/services.dart';

class AutoFillHelper {
  static const platform = MethodChannel('com.example/autofill');

  static Future<void> fillData(String text) async {
    try {
      await platform.invokeMethod('autoFill', {'text': text});
    } on PlatformException catch (e) {
      print("Failed: '${e.message}'");
    }
  }
}

Android端(MainActivity.java):

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "com.example/autofill";
    private AutoFillService autoFillService;

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                .setMethodCallHandler((call, result) -> {
                    if (call.method.equals("autoFill")) {
                        String text = call.argument("text");
                        autoFillService.autoFill(text);
                        result.success(null);
                    } else {
                        result.notImplemented();
                    }
                });
    }
}

注意事项

  • 用户需手动开启无障碍权限:在系统设置中启用你的应用服务
  • 仅限Android:iOS由于系统限制无法实现
  • 目标应用输入框ID:需通过UI Automator Viewer获取
  • 隐私合规:确保符合Google Play政策

使用方式

// 在Flutter中调用
AutoFillHelper.fillData("要填写的文本");

此方案需要用户授权,且仅适用于Android平台。建议在应用中引导用户开启无障碍服务。

回到顶部