首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android硬件键打开应用程序,就像照相机一样

Android硬件键打开应用程序,就像照相机一样
EN

Stack Overflow用户
提问于 2022-09-22 12:48:52
回答 1查看 44关注 0票数 0

我读过这里,当活动处于运行状态时,如何收听硬件:

代码语言:javascript
复制
@Override
public boolean onKeyDown(int keycode, KeyEvent e) {
    switch(keycode) {
        case KeyEvent.KEYCODE_MENU:
            doSomething();
            return true;
    }

    return super.onKeyDown(keycode, e);
}

我想使用“触发器”按钮打开/提前我的应用程序(我的MainActivity),如果它在后台(活动停止)或根本不运行(尚未启动或关闭)。

问题:

  1. 我能听一下Android服务的硬件键盘和打开/提前活动吗?
  2. 我怎么能这么做?

我的应用程序是一个条形码/RFID工具,它将运行在这样的设备上:

无论屏幕上显示的是什么,工业环境都需要“立即运行应用程序并扫描”功能。理想情况下,如果它能唤醒整个设备,使仓库更容易工作,那就太糟糕了。

所以我才需要这个。

EN

回答 1

Stack Overflow用户

发布于 2022-09-22 16:00:56

所以在这个时候(2022年9月),安卓发展指南说,有从背景开始活动的限制。也有一些例外。

在我的例子中(库存管理应用程序带有专用条形码/RFID阅读器硬件),我应该使用专用设备的异常,或者使用某些设备策略控制器:

该应用程序是以设备所有者模式运行的设备策略控制器。示例用例包括完全管理的企业设备,以及诸如数字标志和信息亭之类的专用设备。

https://developer.android.com/work/dpc/dedicated-devices

但是,出于开发目的,我尝试了AccessibilityService,如下面所建议的:链接

当按下键startActivity (在设备上触发键)时,我添加了293。与以上链接的答案相比,我为服务类选择了不同的名称。还必须在XML文件中进行重命名。

src/AccessibilityKeyDetectorService.java

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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" />

我的清单记录:

代码语言:javascript
复制
<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方法:

代码语言:javascript
复制
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;
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73814930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档