Использование android.view.SurfaceView с камерой на части экрана

Я пытаюсь собрать приложение для Android, которое сделает снимок и обработает его каким-то образом. Я бы хотел, чтобы макет был похож на Google Goggles. Значение, предварительный просмотр камеры сверху и некоторые элементы управления внизу, используя портретную ориентацию.

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

Я изменил свой main.xml, чтобы выглядеть следующим образом (на основе комментариев из этого сообщения):

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <android.view.SurfaceView android:id="@+id/preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentTop="true" /> <Button android:id="@+id/snap" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Snap" android:layout_alignParentBottom="true" /> </RelativeLayout> 

Но когда я запускаю этот код, я получаю следующее исключение:

 E/AndroidRuntime( 199): Uncaught handler: thread main exiting due to uncaught exception E/AndroidRuntime( 199): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.beerometer/com.beerometer.ImageCapture}: android.view.InflateException: Binary XML file line #6: Error inflating class Android.view.SurfaceView E/AndroidRuntime( 199): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) E/AndroidRuntime( 199): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) E/AndroidRuntime( 199): at android.app.ActivityThread.access$2200(ActivityThread.java:119) E/AndroidRuntime( 199): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) E/AndroidRuntime( 199): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime( 199): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime( 199): at android.app.ActivityThread.main(ActivityThread.java:4363) E/AndroidRuntime( 199): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime( 199): at java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime( 199): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) E/AndroidRuntime( 199): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) E/AndroidRuntime( 199): at dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime( 199): Caused by: android.view.InflateException: Binary XML file line #6: Error inflating class Android.view.SurfaceView E/AndroidRuntime( 199): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:576) E/AndroidRuntime( 199): at android.view.LayoutInflater.rInflate(LayoutInflater.java:618) E/AndroidRuntime( 199): at android.view.LayoutInflater.inflate(LayoutInflater.java:407) E/AndroidRuntime( 199): at android.view.LayoutInflater.inflate(LayoutInflater.java:320) E/AndroidRuntime( 199): at android.view.LayoutInflater.inflate(LayoutInflater.java:276) E/AndroidRuntime( 199): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198) E/AndroidRuntime( 199): at android.app.Activity.setContentView(Activity.java:1622) E/AndroidRuntime( 199): at com.beerometer.ImageCapture.onCreate(ImageCapture.java:37) E/AndroidRuntime( 199): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) E/AndroidRuntime( 199): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) E/AndroidRuntime( 199): ... 11 more E/AndroidRuntime( 199): Caused by: java.lang.ClassNotFoundException: Android.view.SurfaceView in loader dalvik.system.PathClassLoader@44bfc7b0 E/AndroidRuntime( 199): at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) E/AndroidRuntime( 199): at java.lang.ClassLoader.loadClass(ClassLoader.java:573) E/AndroidRuntime( 199): at java.lang.ClassLoader.loadClass(ClassLoader.java:532) E/AndroidRuntime( 199): at android.view.LayoutInflater.createView(LayoutInflater.java:466) E/AndroidRuntime( 199): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565) E/AndroidRuntime( 199): ... 20 more 

Когда я заменяю SurfaceView выше чем-то другим, например TextView, который он отображает, но в ландшафте.

Как получить предварительный просмотр камеры на части экрана, используя портретный вид?

благодаря

Во-первых, ваш макет, вероятно, не даст вам то, что вы хотите. Подумайте об использовании RelativeLayout , когда Button привязана к нижней части, а SurfaceView привязана к верхней части экрана и верхней части Button .

Кроме того, у вас есть дубликат xmlns:android="http://schemas.android.com/apk/res/android" на вашем SurfaceView который вам не нужен. Один из ваших корневых элементов будет достаточным.

Что касается вашего исключения, в вашей трассировке стека может быть больше деталей, которые вам не хватает, объясняя, почему startPreview() не удалось. Найдите «причину» или другую линию в середине трассировки стека. Если вы не можете его идентифицировать, отредактируйте свой вопрос и вставьте его во всю трассировку стека (и напишите мне через комментарий к этому ответу, так как я не буду знать об изменении в противном случае).

Вы также можете поэкспериментировать с этим примером книги в качестве другого приложения предварительного просмотра Camera , чтобы узнать, есть ли что-то о том, как я подхожу к проблеме, которая лучше подходит для ваших обстоятельств.

Если я чего-то не пропущу, вы не можете просто использовать SurfaceView как есть. Вам нужен собственный производный класс. Обычно я создаю это представление программно и даю ему полный экран. Но вы можете покрыть его части другими видами, включая кнопки:

  setContentView(new CameraView()); View mainscreen = getLayoutInflater().inflate(R.layout.mainscreen, null, false); ViewGroup.LayoutParams generalLayoutParam = new ViewGroup.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT); addContentView(mainscreen, generalLayoutParam); 

Да, вы можете использовать surfaceView. С поверхностиView вы можете получить SurfaceHolder, который затем можно использовать для установки предварительного просмотра камеры.

  SurfaceView preview = (SurfaceView) findViewById(R.id.cameraPreview); SurfaceHolder previewHolder = preview.getHolder(); previewHolder.addCallback(surfaceCallback); previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

Вам нужно будет реализовать метод SurfaceHolder.Callback, чтобы правильно обновить размер предварительного просмотра. В surfaceCreated задайте предварительный просмотр изображения камеры. На поверхностиChanged обновите PreviewSize для камеры.

 camera.setPreviewDisplay(previewHolder); 

На самом деле пример, упомянутый выше, является очень хорошей ссылкой!

Intereting Posts
Не удается найти класс символов onClickListener Android SDK скачать с Eclipse, получение сообщения об ошибке: Не удалось создать каталог C: / Установить отрицательный запас на ImageView сдвигает ImageView, но не изображение Не определены ли методы, включенные в окончательный исполняемый файл? Проблема с базой данных sqlite, нет такой таблицы: Android, который будет использоваться для переполнения объектов на следующую строку Проблемы с использованием нового компонента панели инструментов, скрытие и отображение значка навигационного ящика, событие «Нажать вверх» по событию, щелкнув по фрагментам Android: screenOrientation? Можете ли вы пойти на пейзаж только на устройствах с высоким разрешением? Учебное пособие для камеры для Android (с использованием поверхностного обзора) Обычная задача Android (эквивалент cronjob) Как создать пользовательское уведомление Push для моего собственного приложения? Можно ли передавать данные POST в действие Android с помощью специальной схемы URL? Android После добавления размера APK Admob слишком много увеличилось Как добавить меню опций панели действий в Android Fragments Как объединить вызов программным способом, когда выполняется другой вызов (Конференц-вызов)