我读过这里,当活动处于运行状态时,如何收听硬件:
@Override
public boolean onKeyDown(int keycode, KeyEvent e) {
switch(keycode) {
case KeyEvent.KEYCODE_MENU:
doSomething();
return true;
}
return super.onKeyDown(keycode, e);
}我想使用“触发器”按钮打开/提前我的应用程序(我的MainActivity),如果它在后台(活动停止)或根本不运行(尚未启动或关闭)。
问题:
我的应用程序是一个条形码/RFID工具,它将运行在这样的设备上:

无论屏幕上显示的是什么,工业环境都需要“立即运行应用程序并扫描”功能。理想情况下,如果它能唤醒整个设备,使仓库更容易工作,那就太糟糕了。
所以我才需要这个。
发布于 2022-09-22 16:00:56
所以在这个时候(2022年9月),安卓发展指南说,有从背景开始活动的限制。也有一些例外。
在我的例子中(库存管理应用程序带有专用条形码/RFID阅读器硬件),我应该使用专用设备的异常,或者使用某些设备策略控制器:
该应用程序是以设备所有者模式运行的设备策略控制器。示例用例包括完全管理的企业设备,以及诸如数字标志和信息亭之类的专用设备。
https://developer.android.com/work/dpc/dedicated-devices
但是,出于开发目的,我尝试了AccessibilityService,如下面所建议的:链接
当按下键startActivity (在设备上触发键)时,我添加了293。与以上链接的答案相比,我为服务类选择了不同的名称。还必须在XML文件中进行重命名。
src/AccessibilityKeyDetectorService.java
public class AccessibilityKeyDetectorService extends AccessibilityService {
private final String TAG = "AccessKeyDetector";
@Override
public boolean onKeyEvent(KeyEvent event) {
Log.d(TAG,"Key pressed via accessibility is: "+event.getKeyCode());
if (event.getKeyCode() == 293)
{
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this is required to open Activity from service
startActivity(intent);
}
return super.onKeyEvent(event);
}
@Override
protected void onServiceConnected() {
Log.i(TAG,"Service connected");
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
}My res/xml/accessibility_service.xml:
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityFlags="flagRequestFilterKeyEvents"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:notificationTimeout="100"
android:canRetrieveWindowContent="true"
android:settingsActivity=""
android:packageNames="pl.globalsystem.rflow"
android:canRequestFilterKeyEvents="true" />我的清单记录:
<service android:name=".services.AccessibilityKeyDetectorService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service" />
</service>以及我用于访问权限的MainActivity方法:
public boolean checkAccessibilityPermission() {
int accessEnabled=0;
try {
accessEnabled = Settings.Secure.getInt(this.getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
} catch (Settings.SettingNotFoundException e) {
e.printStackTrace();
}
if (accessEnabled==0) {
/** if not construct intent to request permission */
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
/** request permission via start activity for result */
startActivity(intent);
return false;
} else {
return true;
}
}https://stackoverflow.com/questions/73814930
复制相似问题