Я создал плагин 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();
}
});
}
Есть ли у кого-нибудь предложения / решения?