我们所说的设备是一个带有外部USB键盘的Android 8主机。
嗯,我需要为该键盘的功能键分配一些任务,例如启动某些应用程序。假设F4
可以启动媒体播放器,F5
导航应用程序,依此类推。为此, Automate 或 AutoInput Tasker插件都将是不错的选择,但是所有此类应用程序都使用可访问性服务与物理设备进行交互HID设备。
这里的最大问题是,这台特定的Android设备会在(热)重新启动时定期终止可访问性服务。尝试了所有操作,从禁用省电模式到将“自动”等标记为设备管理应用,没有任何帮助。因此,我已经辞职,现在我正在考虑另一种方法,以便在系统出于未知原因重启后禁用相应的辅助功能后重新启用相应的辅助功能。
如果设备已植根,我想将有一种简单的方法,可以通过shell命令或其他任何方式重新启动可访问性服务(只是猜测,我是Android的初学者)。但是很明显,我想避免生根。理想的情况是在每次重新启动时(自动)启动一个shell命令/应用程序/前台服务/任何东西-这将具有足够的管理特权以重新启用系统在重新启动期间禁用的可访问性服务。当然,所有这些东西都不会生根设备。但是我不确定这是否可以在Android上完成(在Windows上,以系统帐户运行的服务就足够了,但是Android则完全不同了。)
一个公平的解决方案可能是
有人可以告诉我上述解决方案是否可以达到预期的结果;如果可以,请问我有一些指导如何做到这一点?
答案 0 :(得分:1)
要实现您的目的,您应该使用 BroadcastReceiver 和 jobIntentService
首先创建一个启动接收器
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
MyService.enqueueWork(context, new Intent());
}
}
}
将其添加到manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<service android:name=".MyService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
现在您必须定义您的工作意图
public class MyService extends JobIntentService {
public static final int JOB_ID = 0x01;
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, MyService.class, JOB_ID, work);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
// your code
}
}
就是这样。这将直接启动服务(在O之前的平台上运行时)或将其排队作为工作(在O或更高版本上运行时)。无论平台是什么,您在enqueueWork中传递的所有内容最终都会出现在onHandleWork中。