Android Доступ к камере Unity ARCore - PullRequest
       108

Android Доступ к камере Unity ARCore

0 голосов
/ 04 августа 2020

Я создал плагин Android (файл .AAR) для приложения дополненной реальности Unity3d. Приложение дополненной реальности Unity3d - это стандартное демонстрационное приложение HelloAR . Это приложение AR использует Google AR Core. Информацию о разработке собственных плагинов Andriod для Unity3D можно найти здесь .

Приложение Unity3D AR загружает плагин .AAR и пытается открыть камеру, сделать снимок и сохранить его в файл, без какого-либо ввода от пользователя: без пользовательского интерфейса, без нажатия кнопок и без предварительного просмотра захвата для пользователя.

Когда мой плагин пытается сделать снимок, я получаю следующее исключение:

2020/08/06 18:47:15.857 19906 21180 Info CameraManagerGlobal Camera 1 facing CAMERA_FACING_FRONT state now CAMERA_STATE_OPEN for client com.cambridge.helloar API Level 1
2020/08/06 18:47:15.877 19906 19906 Warn System.err java.io.IOException: setPreviewTexture failed
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at android.hardware.Camera.setPreviewTexture(Native Method)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at com.cambridge.helloar.PluginManager.takePhoto(PluginManager.java:242)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at com.cambridge.helloar.PluginManager.access$100(PluginManager.java:38)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at com.cambridge.helloar.PluginManager$4.run(PluginManager.java:351)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at android.os.Handler.handleCallback(Handler.java:883)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at android.os.Handler.dispatchMessage(Handler.java:100)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at android.os.Looper.loop(Looper.java:237)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at android.app.ActivityThread.main(ActivityThread.java:8107)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at java.lang.reflect.Method.invoke(Native Method)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
2020/08/06 18:47:15.877 19906 19906 Debug TAKEPHOTO Opened camera
2020/08/06 18:47:15.877 19906 19906 Debug TAKEPHOTO Started preview
2020/08/06 18:47:15.877 19906 19906 Warn System.err java.lang.RuntimeException: takePicture failed
2020/08/06 18:47:15.877 19906 19906 Warn System.err     at android.hardware.Camera.native_takePicture(Native Method)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at android.hardware.Camera.takePicture(Camera.java:1564)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at android.hardware.Camera.takePicture(Camera.java:1506)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at com.cambridge.helloar.PluginManager.takePhoto(PluginManager.java:250)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at com.cambridge.helloar.PluginManager.access$100(PluginManager.java:38)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at com.cambridge.helloar.PluginManager$4.run(PluginManager.java:351)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at android.os.Handler.handleCallback(Handler.java:883)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at android.os.Handler.dispatchMessage(Handler.java:100)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at android.os.Looper.loop(Looper.java:237)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at android.app.ActivityThread.main(ActivityThread.java:8107)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at java.lang.reflect.Method.invoke(Native Method)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
2020/08/06 18:47:15.878 19906 19906 Warn System.err     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)

Я пробовал использовать и переднюю, и заднюю камеру, но в обоих случаях получаю это исключение.

Я также заметил, что получаю предупреждение в моем приложении AR, в котором говорится что-то вроде «другое приложение использует камеры. Коснитесь этого приложения или попробуйте закрыть другое приложение ", так что это определенно связано с тем, что камера блокируется ARCore. Я не хочу мешать приложению Unity3D AR использовать камеру ... конечно. Вместо этого я хочу, чтобы приложение AR и мой плагин ОБЕИМ имели доступ к камере.

Я знаю, что мой код плагина работает, потому что выполнение этого в приложении, не поддерживающем AR, работает, и изображение делается в фоновом режиме.

Вот код:

@SuppressWarnings("deprecation")
private static void takePhoto() {

    Log.d("TAKEPHOTO", "Surface created");

    SurfaceTexture surfaceTexture = new SurfaceTexture(10);
    Camera camera = Camera.open(0);
    camera.getParameters().setPreviewSize(1, 1);
    try {
        camera.setPreviewTexture(surfaceTexture);
    } catch (IOException e) {
        e.printStackTrace();
    }

    Log.d("TAKEPHOTO", "Opened camera");

    Log.d("TAKEPHOTO", "Started preview");
    camera.takePicture(null, null, new Camera.PictureCallback() {

        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            Log.d("TAKEPHOTO", "Took picture");

            File pictureFileDir = new File("/sdcard/CaptureByService");
            if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {
                return;
            }
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
            String date = dateFormat.format(new Date());
            String photoFile = "PictureFront_" + "_" + date + ".jpg";
            String filename = pictureFileDir.getPath() + File.separator + photoFile;
            File mainPicture = new File(filename);
            try {
                FileOutputStream fos = new FileOutputStream(mainPicture);
                fos.write(data);
                fos.close();
                Log.d("TAKEPHOTO", "image saved");
            } catch (Exception error) {
                Log.d("TAKEPHOTO", "Image could not be saved");
                error.printStackTrace();
            }


            camera.release();
        }
    });
}

Есть ли у кого-нибудь предложения / решения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...