gpt4 book ai didi

android - 在默认系统相机应用程序中模拟拍照

转载 作者:行者123 更新时间:2023-11-30 00:59:43 25 4
gpt4 key购买 nike

我正在制作 android 语音助手应用程序...在后台运行服务以识别语音命令。当用户说“selfie”这个词时,我想在默认系统相机应用程序中拍照。我已经知道如何使用语音命令,但问题是我无法让相机应用程序拍照 ...

我尝试了一些方法但不会帮助

第一次我尝试模拟安卓相机按键事件

Intent intent1 = new Intent("android.intent.action.CAMERA_BUTTON");
intent1.putExtra("android.intent.extra.KEY_EVENT", new KeyEvent(0,
KeyEvent.KEYCODE_CAMERA));
sendOrderedBroadcast(intent1, null);
intent1 = new Intent("android.intent.action.CAMERA_BUTTON");
intent1.putExtra("android.intent.extra.KEY_EVENT", new KeyEvent(1,
KeyEvent.KEYCODE_CAMERA));
sendOrderedBroadcast(intent1, null);

这个打开相机但不会在没有物理相机键的手机中拍照

第二次我尝试注入(inject)按键事件“enter”……比如蓝牙遥控快门……

    KeyEvent eventDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER);
KeyEvent eventUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER);
dispatchKeyEvent(eventDown);
dispatchKeyEvent(eventUp);

但是在这个问题中我遇到了两个问题,第一个是这个代码不能在服务中使用,第二个是不可能将事件注入(inject)到其他应用程序,因为只有系统应用程序可以做到这一点

现在的问题是我该如何解决这个问题? 有可能吗?我在网上读到一些关于 appium 可以做到这一点的东西,但它是在线的,我希望我的应用程序离线工作

请注意:添加相机权限和注入(inject)事件权限无济于事,我不想使用相机 api,因为我想在默认系统相机应用程序中拍照。

最佳答案

是的,有可能经过 2 天的调查,我找到了解决方案。

Requirement : Open system camera app and click pic.

第 1 步:

在 list 文件中添加相机权限:

<uses-permission android:name="android.permission.CAMERA"/>

<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front"
android:required="false" />

第 2 步: 创建一个扩展 AccessibilityService

的服务
    <service
android:name=".AccessTest"
android:enabled="true"
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_config"/>
</service>

第 3 步:在需要时启动服务

    Intent mailAccessabilityIntent = new Intent(getApplicationContext(), AccessTest.class);
startService(mailAccessabilityIntent);

第 4 步: 添加辅助功能文件。

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagEnableAccessibilityVolume"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:packageNames="com.google.android.GoogleCamera"
android:settingsActivity="com.mobiliya.cameraautoclick.MainActivity" />

第 5 步:在您要处理相机相关监听器的地方编写服务类。

public class AccessTest extends AccessibilityService {

private final static String TAG = "Yogesh";


@Override
public void onCreate() {
super.onCreate();
Log.d("Yogesh","I am started");
}

@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.d(TAG, "onServiceConnected");
}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Log.d(TAG, "ACC::onAccessibilityEvent: " + event.getEventType());

//TYPE_WINDOW_STATE_CHANGED == 32
if (AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED == event
.getEventType()) {
AccessibilityNodeInfo nodeInfo = event.getSource();

if (nodeInfo == null) {
return;
}


Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

String x = takePictureIntent.resolveActivity(getPackageManager()).getPackageName();

Log.d("Yogesh","Package name " + x);

List<AccessibilityNodeInfo> list1 = nodeInfo.findAccessibilityNodeInfosByText("Switch to front camera");

for (AccessibilityNodeInfo node : list1) {
Log.i(TAG, "ACC::onAccessibilityEvent: click " + node);
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}

final List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("Take photo");


final android.os.Handler handler = new android.os.Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {

for (AccessibilityNodeInfo node : list) {
Log.i(TAG, "ACC::onAccessibilityEvent: click " + node);
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
handler.postDelayed(this,5000);
}
},10000);

for (AccessibilityNodeInfo node : list) {
Log.i(TAG, "ACC::onAccessibilityEvent: click " + node);
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}

Log.d(TAG,"Access " + getAllChildNodeText(nodeInfo).toString());
}
}



private List<CharSequence> getAllChildNodeText(AccessibilityNodeInfo infoCompat) {
List<CharSequence> contents = new ArrayList<>();
if (infoCompat == null)
return contents;
if (infoCompat.getContentDescription() != null) {
contents.add(infoCompat.getContentDescription().toString().isEmpty() ? "unlabelled" : infoCompat.getContentDescription());
} else if (infoCompat.getText() != null) {
contents.add(infoCompat.getText().toString().isEmpty() ? "unlabelled" : infoCompat.getText());
} else {
getTextInChildren(infoCompat, contents);
}
if (infoCompat.isClickable()) {
if (infoCompat.getClassName().toString().contains(Button.class.getSimpleName())) {
if (contents.size() == 0) {
contents.add("Unlabelled button");
} else {
contents.add("button");
}
}
contents.add("Double tap to activate");
}
return contents;
}


private void getTextInChildren(AccessibilityNodeInfo nodeInfoCompat, List<CharSequence> contents) {
if (nodeInfoCompat == null)
return;
if (!nodeInfoCompat.isScrollable()) {
if (nodeInfoCompat.getContentDescription() != null) {
contents.add(nodeInfoCompat.getContentDescription());
} else if (nodeInfoCompat.getText() != null) {
contents.add(nodeInfoCompat.getText());
}
if (nodeInfoCompat.getChildCount() > 0) {
for (int i = 0; i < nodeInfoCompat.getChildCount(); i++) {
if (nodeInfoCompat.getChild(i) != null) {
getTextInChildren(nodeInfoCompat.getChild(i), contents);
}
}
}
}
}



@Override
public void onInterrupt() {

}
}

这里 getAllChildNodeText() 返回所有可点击的文本按钮,Google 默认应用程序有 Take Photo 文本,因此您可以为此 View 执行操作。

为每 10 秒捕获一次图片添加了处理程序,以进一步说明。

如果您想跟踪多个摄像头应用程序,请删除下面的行并使用 Java 代码设置包更多详细信息请参阅 - Accessibility Service

android:packageNames="com.google.android.GoogleCamera"

我上传了工作示例 -> https://github.com/ycrathi/cameraautoclick

注意:在上面的 GitHub 存储库中有多个不需要的代码,我试过了。

This solution is not global for all app. You can find some famous app like google camera and find text and then perform click action package wise.

关于android - 在默认系统相机应用程序中模拟拍照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39597012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com