我正在开发一个无障碍应用程序在Android Studio,Java。
我以编程方式启用对讲作为辅助功能服务:
public class TalkBackToggler {
//In the terminal run the command line:
// adb shell pm grant com.MyApp android.permission.WRITE_SECURE_SETTINGS
private static final String VALUE_DISABLED = "0";
private static final String VALUE_ENABLED = "1";
private final ContentResolver contentResolver;
private final Callback callback;
private Context context;
TalkBackToggler(ContentResolver contentResolver, Callback callback, Context context) {
this.contentResolver = contentResolver;
this.callback = callback;
this.context = context;
}
public void enableTalkBack()
{
try {
AccessibilityManager am = (AccessibilityManager)(context.getSystemService(Context.ACCESSIBILITY_SERVICE));
List<AccessibilityServiceInfo> services = am.getInstalledAccessibilityServiceList();
if (services.isEmpty()) {
return;
}
AccessibilityServiceInfo service = services.get(0);
boolean enableTouchExploration = (service.flags
& AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0;
ServiceInfo serviceInfo;
ComponentName componentName;
String enabledServiceString = "";
if (!enableTouchExploration) {
final int serviceCount = services.size();
for (int i = 1; i < serviceCount; i++) {
AccessibilityServiceInfo candidate = services.get(i);
serviceInfo = candidate.getResolveInfo().serviceInfo;
componentName = new ComponentName(serviceInfo.packageName, serviceInfo.name);
enabledServiceString = componentName.flattenToString();
if (enabledServiceString.contains("talkback")) {
if ((candidate.flags & AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) == 0) {
candidate.flags = candidate.flags | AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
}
enableTouchExploration = true;
break;
}
}
}
ContentResolver resolver = context.getContentResolver();
Settings.Secure.putString(resolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, enabledServiceString);
if (enableTouchExploration) {
Settings.Secure.putString(resolver, Settings.Secure.TOUCH_EXPLORATION_ENABLED, VALUE_ENABLED);
}
Settings.Secure.putString(resolver, Settings.Secure.ACCESSIBILITY_ENABLED, VALUE_ENABLED);
}
catch(Exception e) {
Log.e("Device", "Failed to enable accessibility: " + e);
}
}
}
我有一个自定义的AccessibiltyService,我还以编程方式启用该服务:
public class MyAccessibiltyService extends AccessibilityService {
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.v(TAG, "onServiceConnected");
AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.flags = AccessibilityServiceInfo.DEFAULT;
info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
setServiceInfo(info);
}
在AndroidManifest中。xml我已注册了两项服务:
<service
android:name=".activities.MyAccessibiltyService"
android:enabled="true"
android:exported="true"
android:label="Keynoa"
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/my_accessibility_service_config" />
</service>
<service
android:name=".activities.TalkBackToggleService"
android:enabled="true"
android:exported="true"
android:label="Keynoa"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
<meta-data
android:name="android.service.quicksettings.ACTIVE_TILE"
android:value="true" />
</service>
问题是:我无法以编程方式同时启用对讲服务和辅助功能服务;当我启用一项服务时,另一项服务被禁用。
但是当我从设备设置手动启用对讲时,我的辅助功能服务与对讲同时保持启用状态!
我想知道有没有一种方法可以以编程方式启用这两个服务,并使它们同时保持启用状态?
非常感谢。
您正在覆盖启用服务的设置,因此启用的服务列表仅包含TalkBack。如果您查看设置代码,当切换服务时,会有一个读取-修改-写入。
您已经远离了公共API的道路,从仅系统权限授予开始,所以您应该期待脆性。
我有一个有很多数字的表格,我想对所有的数字都使用数字格式。所以现在我有这个: 但我只是重复相同的函数number_format(),当有人决定格式不同时,可能会出现问题。然后我必须更改表中的所有格式。我对Nette框架有一些经验,并且存在一个选项,我可以拥有自定义帮助器,然后在模板中使用它,即:在管道之后,我有自己的自定义帮助器。Laravel刀片模板中是否有类似的内容?我在文档中没有找到任何关于
由于我更新Android Studio到3.5,当我启动运行来构建和部署我的应用程序时,我的自定义辅助功能服务会自动关闭(不是崩溃,只是在设置中关闭)。 你能帮帮我吗?
目前,我将辅助注射与命名参数一起使用,如下所示: 这很棒。但是我认为使用字符串作为参数的标识符有点难看。我想做的是以下内容: 所以本质上我想要自定义辅助注释。有办法做到这一点吗?
问题内容: 使用Google Guice或Gin,我可以指定不受依赖项注入框架控制的参数: 辅助参数是在创建实例时指定的。 SomeClassA的实例是从对象图中获取的,而SomeClassB的实例是从运行时的调用者中获取的。 在Dagger中有类似的方法吗? 问题答案: 因为工厂是一种单独的样板,可以进行优化(请参阅此处的邮件列表讨论),所以Dagger将其留给了姊妹项目AutoFactory。
问题内容: 我想计算mysql表中的行数,而不要包含重复的条目, 我可以用吗? 问题答案: 当然。
我想在一个项目中使用两种方法(反应式和标准式)。 我尝试将一个REST APIendpoint迁移到反应式webflux,并在迁移其余endpoint之前测试性能。但没用。我为他添加了路由器和处理程序,但直到我没有从依赖项中删除,并禁用之前,我一直得到http代码。有没有可能?还是我应该将所有项目迁移到反应式方法?