w2016561536 / android_virtual_cam

xposed安卓虚拟摄像头 android virtual camera on xposed hook
MIT License
1.37k stars 381 forks source link

openCamera(String cameraId, Executor executor, CameraDevice.StateCallback callback)有问题 #6

Closed bad-copy closed 3 years ago

bad-copy commented 3 years ago

openCamera(String cameraId, Executor executor, CameraDevice.StateCallback callback) 这个从Android P开始才有的,之前的版本都没有。

如果不做处理的话,会报以下错误: submitRequestList - cannot use a surface that wasn't configured

导致无法显示内容。

w2016561536 commented 3 years ago

这一点我确实考虑到了(参见HookMain.java:142行),同时,被API30抛弃的openCamera也在130行考虑到了 老版的API我测试没啥问题(抖音没啥问题,谷歌翻译Fail,支付宝扫描二维码显示启动摄像头失败,三星系统相机也是打不开),但我找不到问题在哪(我确定我在createCaptureSession里修改了那个Arraylist)

w2016561536 commented 3 years ago

修正一下,谷歌翻译拍照是闪退 这是一个第三方相机demo的崩溃日志 Name : 相机 Build version: 1.0 Build date: 1979-11-30 00:00:00 Current date: 2021-08-23 20:54:33 Device: Samsung SM-A6060

Stack trace:
java.lang.UnsupportedOperationException: The producer output buffer format 0x7fa30c06 doesn't match the ImageReader's configured buffer format 0x21. at android.media.ImageReader.nativeImageSetup(Native Method) at android.media.ImageReader.acquireNextSurfaceImage(ImageReader.java:464) at android.media.ImageReader.acquireNextImage(ImageReader.java:518) at android.media.ImageReader.acquireLatestImage(ImageReader.java:411) at com.smewise.camera2.manager.Session.getByteFromReader(Session.java:84) at com.smewise.camera2.manager.CameraSession$1.onImageAvailable(CameraSession.java:288) at android.media.ImageReader$ListenerHandler.handleMessage(ImageReader.java:812) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8512) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139)

从中看到,真正原因可能是格式问题,但是那个16进制的格式代码,在ImageFormat类里根本查不到。

w2016561536 commented 3 years ago

谷歌相机崩溃的原因可能就是Mediaplayer在作为内容提供者向ImageReader提供内容时格式对不上,导致了这个问题 我把mediaplayer的prepare那条给注释掉了,谷歌相机不崩溃了,但是其他应用也提示无法开启摄像头(imagereader一直没有内容更新) 所以解决方案:换一个新的内容提供者,能兼容imagereader的。

bad-copy commented 3 years ago

你提到的问题跟我讲的可能不是同一个问题。

在我的测试环境下,只需要改一下版本号就可以正常预览了: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { // 这里改成这样 XposedHelpers.findAndHookMethod("android.hardware.camera2.CameraManager", lpparam.classLoader, "openCamera", String.class,java.util.concurrent.Executor.class , CameraDevice.StateCallback.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); c2_state_callback = param.args[2].getClass(); XposedBridge.log("2位参数初始化相机,类:"+c2_state_callback.toString()); process_camera2_init(c2_state_callback); } }); }

w2016561536 commented 3 years ago

你提到的问题跟我讲的可能不是同一个问题。

在我的测试环境下,只需要改一下版本号就可以正常预览了: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { // 这里改成这样 XposedHelpers.findAndHookMethod("android.hardware.camera2.CameraManager", lpparam.classLoader, "openCamera", String.class,java.util.concurrent.Executor.class , CameraDevice.StateCallback.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); c2_state_callback = param.args[2].getClass(); XposedBridge.log("2位参数初始化相机,类:"+c2_state_callback.toString()); process_camera2_init(c2_state_callback); } }); }

如果你方便的话,那请帮忙发一个pull request。

w2016561536 commented 3 years ago

你好,我又发现一个bug,但我目前无法解决,由于没有联系方式,我重新打开了这个issue。 在QQ应用中,扫描功能中有个翻译选项,当我点击拍照时,存在HOOK遗漏的现象(有时候是整个帧遗漏,有的时候是半帧),如图 130605796-e84f4880-9a8e-48da-9b01-7ec2b06f33a0 这就是丢半帧的清空,上半部分是我瞎画的,下半部分是真实摄像头。 我目前对此没有解决的思路(隔壁微信就没有这个问题),想请问你有没有啥好方案。

w2016561536 commented 3 years ago

缓冲区数据刷新太快导致,每次制裁一下缓冲区就好了,12的release就针对这个修复了