Usando android.view.SurfaceView com uma câmera na parte da tela

votos
8

Eu tentando montar um aplicativo Android que irá tirar uma foto e processá-lo de alguma forma. Eu gostaria o layout para ser semelhante ao Google Goggles. Significado, visualização da câmera na parte superior, e alguns controles na parte inferior usando a orientação retrato.

Eu construí uma primeira versão usando exemplo de código a partir de aqui . Isso funciona, mas eu quero adicionar um botão na parte inferior.

Eu modifiquei meu main.xml para olhar o seguinte (com base em comentários de este post):

<?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>

Mas quando eu executar esse código eu recebo a seguinte exceção:

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

Quando eu substituir o SurfaceView acima com outra coisa, por exemplo, um TextView, que ele exibe, mas na paisagem.

Como posso obter uma visualização da câmera na parte da tela usando o modo retrato?

obrigado

Publicado 21/03/2010 em 00:04
fonte usuário
Em outras línguas...                            


3 respostas

votos
11

Em primeiro lugar, o seu layout provavelmente não vai lhe dar o que você quer. Considere usar um RelativeLayout, com o Buttonancoradas ao fundo, eo SurfaceViewancorado ao topo da tela e o topo da Button.

Além disso, você tem uma duplicata xmlns:android="http://schemas.android.com/apk/res/android"em seu SurfaceViewque você não precisa. A um em seu elemento raiz será suficiente.

Em termos de sua exceção, pode haver mais detalhes no seu rastreamento de pilha que está faltando, explicando porque startPreview()falhou. Procure por um "causada por" ou outra linha a meio do rastreamento de pilha. Se não for possível identificá-lo, editar a sua pergunta e colar em todo o rastreamento de pilha (e pingar me via um comentário sobre esta resposta, já que não vai saber sobre a edição de outra forma).

Você também pode experimentar com este exemplo livro como outro Cameraaplicativo de visualização, para ver se há algo sobre como eu abordar o problema que funciona melhor para a sua circunstância.

Respondeu 21/03/2010 em 00:12
fonte usuário

votos
2

Sim, você pode usar um SurfaceView. Do SurfaceView você pode obter o SurfaceHolder que depois pode ser usado para definir previewDisplay da câmera.

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

Você precisa implementar o método SurfaceHolder.Callback, a fim de atualizar o tamanho da visualização corretamente. Em surfaceCreated definir o previewDisplay da câmera. Em surfaceChanged atualizar o previewSize para a câmera.

camera.setPreviewDisplay(previewHolder);

Na verdade o exemplo mencionado antes é uma referência muito boa!

Respondeu 29/04/2011 em 09:48
fonte usuário

votos
2

Se eu não estou faltando alguma coisa, você não pode apenas usar SurfaceView como é. Você precisa de uma classe derivada de seu próprio país. Eu costumo criar este ponto de vista de programação, e dar-lhe a tela cheia. Mas você pode cobrir partes dele com outros pontos de vista, incluindo botões:

 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);
Respondeu 08/08/2010 em 13:10
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more