android - 自动填充服务未显示在设置自动填充服务列表中
问题描述
我正在尝试开发一个简单的应用程序,它使用 Android Oreo 中的自动填充框架在其他应用程序中自动填充电子邮件。我已按照本教程开发应用程序。但是运行该应用程序后,我无法在设置中的自动填充服务列表中看到我的自动填充服务来启动它。不知道为什么,求大神帮忙!
这是我构建自动填充服务的代码:
我的服务:
public class EmailAddFiller extends AutofillService {
@Override
public void onFillRequest( @NonNull FillRequest request, @NonNull CancellationSignal cancellationSignal, FillCallback callback) {
List<AssistStructure.ViewNode> emailFields = new ArrayList<>();
// Get the structure from the request
List<FillContext> context = request.getFillContexts();
AssistStructure structure = context.get(context.size() - 1).getStructure();
identifyEmailFields(structure
.getWindowNodeAt(0)
.getRootViewNode(), emailFields);
AssistStructure.ViewNode emailField = emailFields.get(0);
SharedPreferences sharedPreferences =
getSharedPreferences("EMAIL_STORAGE", MODE_PRIVATE);
String primaryEmail =
sharedPreferences.getString("PRIMARY_EMAIL", "");
String secondaryEmail =
sharedPreferences.getString("SECONDARY_EMAIL", "");
Dataset primaryEmailDataSet =
new Dataset.Builder()
.setValue(
emailField.getAutofillId(),
AutofillValue.forText(primaryEmail)
).build();
Dataset secondaryEmailDataSet =
new Dataset.Builder()
.setValue(
emailField.getAutofillId(),
AutofillValue.forText(secondaryEmail)
).build();
FillResponse response = new FillResponse.Builder()
.addDataset(primaryEmailDataSet)
.addDataset(secondaryEmailDataSet)
.build();
callback.onSuccess(response);
}
private void identifyEmailFields(AssistStructure.ViewNode node, List<AssistStructure.ViewNode> emailFields) {
if(node.getClassName().contains("EditText")) {
String viewId = node.getIdEntry();
if(viewId!=null && (viewId.contains("email")
|| viewId.contains("username"))) {
emailFields.add(node);
return;
}
}
for(int i=0; i<node.getChildCount();i++) {
identifyEmailFields(node.getChildAt(i), emailFields);
}
}
@Override
public void onSaveRequest(@NonNull SaveRequest request, @NonNull SaveCallback callback) {
}
}
以及 Manifestation 文件中的配置:
<?xml version="1.0" encoding="utf-8"?>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".EmailAddFiller"
android:label="My Autofill Service"
android:permission="android.permission.BIND_AUTO_FILL">
<meta-data android:name="android.autofill"
android:resource="@xml/email_address_filler"/>
<intent-filter>
<action android:name="android.service.autofill.AutoFillService"/>
</intent-filter>
</service>
</application>
并构建 gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.tam.autofillapp"
minSdkVersion 26
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'org.jetbrains:annotations-java5:15.0'
implementation 'com.android.support:design:28.+'
}
我错过了什么吗?如果有关于该主题的任何其他示例,非常感谢。非常感谢!
解决方案
推荐阅读
- r - raster::stackApply 仅返回 NA 值
- matlab - 如何使用给定数据做 3D 数字密度散点图?
- concurrency - 如何在 Dropwizard 1.3.4 中设置非阻塞配置(用于增加并发性)?
- python - 将包添加到 PyPi SSL 时发生错误
- python-3.x - 如何在 for 循环中中断 1 个循环而不停止整个循环?
- android - Android - 如何在布局文件的线性布局内显示警报对话框?
- angular - 操作成功后关闭角度弹出模型对话框
- android - Android 应用 - 没有文字的基本图标按钮
- python - 如何将嵌套的 json 转换为 csv 或 excel?
- java - 即使变量值为空,如果条件,流量也会进入内部