因此,我试图获取用户在另一个应用程序上键入的内容,如果它与我预先定义的字符串匹配,我需要在文本字段中填充一些内容,而无需他们打开我的应用程序。
我尝试使用AutoFillService,但由于某些原因,它不工作,
<service
android:name=".MyServiceClass"
android:label="MyServiceClass"
android:permission="android.permission.BIND_AUTOFILL_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.service.autofill.AutofillService" />
</intent-filter>
<meta-data
android:name="android.autofill"
android:resource="@xml/service_configuration" />
</service>
在Java服务类中,
@RequiresApi(api = Build.VERSION_CODES.O)
public class MyServiceClass extends AutofillService {
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onConnected() {
super.onConnected();
}
@Override
public void onFillRequest(@NonNull FillRequest fillRequest, @NonNull CancellationSignal cancellationSignal, @NonNull FillCallback fillCallback) {
List<FillContext> fillContexts = fillRequest.getFillContexts();
Dataset dataset = null;
for (FillContext context : fillContexts) {
AssistStructure structure = context.getStructure();
Bundle extras = structure.getWindowNodeAt(0).getRootViewNode().getExtras();
System.out.println(extras);
}
}
@Override
public void onSaveRequest(@NonNull SaveRequest saveRequest, @NonNull SaveCallback saveCallback) {
}
}
因此,当我在另一个应用程序上输入任何文本时,我的服务类没有收到任何信号。据我所知,它只在第三方应用程序使用requestAutofill();
功能或其他功能时才有效,但尝试在需要电子邮件和密码的应用程序上使用它,但我仍然没有收到任何回调。
还有,是否有任何方法可以从任何应用程序的文本字段中获取文本,不管他们是否使用requestAutoFill?
例如,从用户在whatsapp edittext字段中键入的内容中获取文本。
这在Android中可能吗?
2条答案
按热度按时间zy1mlcev1#
除了您在Manifest中声明的内容外,用户还必须在设备设置中将您的服务作为首选自动填充方法启用。如果您还没有看到,请参阅官方文档Build Autofill Services了解更多详细信息。
但一般来说,出于安全原因,自动填充服务不能也不应该访问用户在第三方应用程序中输入的所有数据。正如您已经提到的,如果第三方应用程序中的视图显式声明为
android:importantForAutofill="yes"
,该服务将收到回调。您可能对这篇文章感兴趣-Integrate autofill with keyboards
o8x7eapl2#
自动填充在这里帮不了你,它不是为接收任何地方输入的文本而设计的,只有当它是一个可自动填充的字段并且用户接受一个对话框来保存数据时,服务才会接收输入文本;并且即使这样也不能编辑输入的文本。
另一个答案中提到的“与键盘集成”也没有帮助--它只是另一个用于自动填充的UI表面,它不会改变它的功能。
一个键盘应用程序本身可能能够完成你正在尝试的功能。或者是一个辅助功能服务,尽管在Google Play上发布需要遵守那里的辅助功能服务策略。