android 如何通过蓝牙BLE设备使用辅助功能服务在相机应用程序中拍照?

2ic8powd  于 2023-03-11  发布在  Android
关注(0)|答案(2)|浏览(270)

我有蓝牙(BLE)设备,当我点击按钮时,我想在默认相机应用程序中执行捕捉照片或视频的操作。
有许多蓝牙设备(大部分来自中国),当你在默认的相机应用程序中点击一个按钮“远程拍照”。
我搜索了过去一个月的互联网,我找不到一种方法,如何执行的行动,“点击”按钮上的相机应用程序.
有很多教程如何通过增加音量向上或向下执行捕获图像,但它不起作用,因为您需要特殊的系统权限通过AudioManager.FLAG_FROM_KEY执行它,但为此您需要根设备。
另一个教程展示了如何通过accessibilityEvent找到“按钮”,并在当前打开的应用程序(相机应用程序)中找到文本“拍照”,然后执行单击操作。这不起作用,因为许多默认应用程序现在没有隐藏的文本/标签的按钮。
有人知道从哪里开始寻找或体验吗?
示例代码:

我的无障碍服务.java

public class MyAccessibilityService extends android.accessibilityservice.AccessibilityService
{
    public static AccessibilityService getInstance() {
        return this;
    }

    public void takePhoto() {
        // How to take photo ?
    }

    // ...

从.java调用拍照方法的随机类

public void onSingleClick() {
    myAccessibilityService = MyAccessibilityService.getInstance();
    myAccessibilityService.takePhoto();
}

我在相机应用程序中点击“按钮”的意思是:

rqdpfwrv

rqdpfwrv1#

这些“中国”触发器都使用HID over GATT来模拟音量按钮的按下,IidoEe.就像蓝牙键盘一样。这样你就可以直接在系统设置中配对。不需要应用程序。

ktecyv1j

ktecyv1j2#

据我所知,你应该可以发送一个VOLUME_UP键代码到手机(我只在三星S21上测试过)。不知道你是如何设置你的蓝牙的,我不能提供太多的代码,但Adafruit有一个非常全面的教程和库。Silicon labs' documentation也看起来相当有希望解释所有的细节在一个较低的水平。

编辑2023年3月10日:在BLE C++中发送键码

我在评论中被问到如何发送这个键码,我提到我不确定特定的BLE实现。我假设是Arduino C++,因为我没有其他东西可以继续。在答案的其他部分,我确实引用了Adafruit for a python version

#include <BleKeyboard.h>

BleKeyboard bleKeyboard;

void setup() {
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  bleKeyboard.begin();
}

void loop() {
  if(bleKeyboard.isConnected()) {
    Serial.println("Sending 'Hello world'...");
    bleKeyboard.print("Hello world");

    delay(1000);

    Serial.println("Sending Volume Up Key...");
    bleKeyboard.write(KEY_MEDIA_VOLUME_UP); // edited for the purpose of this answer

    delay(1000);

    Serial.println("Sending Play/Pause media key...");
    bleKeyboard.write(KEY_MEDIA_PLAY_PAUSE);

    delay(1000);

  }
  Serial.println("Waiting 5 seconds...");
  delay(5000);
}

Code SourceArduino key codes
我确实试着比较了Android键码和C++键盘库键码,它们看起来不一样,但我想可能有一些花哨的数学,而不是实际的代码。
如果你想在Android中发送一个密钥代码,你可以使用adb测试它:

adb shell input keyevent KEYCODE_VOLUME_UP

或在Java应用程序中:

Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_VOLUME_UP);

二○二三年三月十日

关于辅助功能服务及其用法的详细说明。

如果您打算将应用发布到Play商店,针对此特定问题的accessibility service可能会工作量太大,而且不太可能获得好评:
辅助功能服务只能用于帮助残疾用户使用Android设备和应用程序。
许多滥用辅助功能服务的应用已经从应用商店中移除,这导致应用必须在其清单中声明isAccessibilityTool标志:
Google Play允许将AccessibilityService API用于各种应用程序。但是,只有那些旨在帮助残障人士访问其设备或克服因其残障而带来的挑战的服务才有资格声明它们是无障碍工具。这可以通过服务元数据文件中的isAccessibilityTool属性来完成。Source
您的用户可能不希望看到隐私声明(关于授予您的应用特权访问权限):
指示辅助功能服务是否用于帮助残障用户的属性。此条件可能由安装程序定义。默认值为false。
注意:如果此标志为假,系统将在一段时间后显示通知,以通知用户有关服务的隐私影响。Source

相关问题