2011-01-25 63 views
1

看过的书和提示,摆脱了所有的编译错误和警告,并把一些调试语句摄像头预览:没有错误,但没有图像:-(

package com.cit.BroadcastSim; 

import java.io.IOException; 

import android.app.Activity; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class BroadcastActivity extends Activity implements SurfaceHolder.Callback { 
    public Camera myCamera; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.broadcast); // Inflate the broadcast.xml file 

    Log.d("BROADCAST", "Creating the Activity"); 
    SurfaceView cameraSurface = (SurfaceView)findViewById(R.id.camerasurface); 
    SurfaceHolder cameraHolder = cameraSurface.getHolder(); 
    cameraHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    cameraHolder.addCallback(this); 
    Log.d("BROADCAST", "Now wait for some CallBacks"); 
} 


    public void surfaceCreated(SurfaceHolder holder) { 
    // Surface created, now it is possible to set the preview 
    Log.d("BROADCAST", "Surface Created"); 
    try { 
     Log.d("BROADCAST","CAMERA: NOT NULL"); 
     myCamera = Camera.open(); 
     myCamera.setPreviewDisplay(holder); 
     myCamera.startPreview(); 
     } catch (IOException e) { 
     Log.d("BROADCAST", e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.d("BROADCAST", "Surface Destroyed"); 
    myCamera.stopPreview(); 
    myCamera.release(); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int I, int J, int K) { 
    Log.d("BROADCAST", "Surface Changed"); 
    myCamera.stopPreview(); 
    myCamera.release(); 
    } 
} 

在DDMS调试器,我得到一个'创建活动'的日志消息,后面跟着'现在等待一些CallBacks',就我的调试消息而言,没有什么更多的了,所以我认为回调不起作用 - 因为我的生活看不到它出错的地方。

在清单我

的活动XML页面有

<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/Broadcast" 
    /> 
<SurfaceView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/camerasurface" 
    /> 
</LinearLayout> 

最后,Android手机(HTC野火)上,页面加载,显示在左上角的TextView的消息,这是所有。

应该提及的是,我对这个平台很陌生,并且认为我可能错过了非常基本的东西。

任何意见/建议,我将非常感激,

奥利弗

回答

0

没有足够的时间来解释(在几分钟内与朋友会议)。我基本上添加了一些函数到“surfaceChanged()”(这是你应该开始预览的地方)。

因此你不需要mCam.startPreview()在 “surfaceCreated()”

public void surfaceCreated(SurfaceHolder holder) { 
    // Surface created, now it is possible to set the preview 
    Log.d("BROADCAST", "Surface Created"); 
    try { 
     Log.d("BROADCAST","CAMERA: NOT NULL"); 
     mCam = Camera.open(); 
     mCam.setPreviewDisplay(holder); 
     //myCamera.startPreview(); 
     } catch (IOException e) { 
     Log.d("BROADCAST", e.getMessage()); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
    Log.d("BROADCAST", "Surface Destroyed"); 
    mCam.stopPreview(); 
    mCam.release(); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int I, int J, int K) { 
     Camera.Parameters parameters = mCam.getParameters(); 
    List<Size> previewSizes = parameters.getSupportedPreviewSizes(); 
    Size bestSize = null; 
    int bestDiff = 0; 
    int diff = 0; 
    for (Size size : previewSizes) { 
      diff = Math.abs(K - size.height) + Math.abs(J - size.width); 
     if (bestSize == null || diff < bestDiff) { 
       bestSize = size; 
       bestDiff = diff; 
     } 
     parameters.setPreviewSize(bestSize.width, bestSize.height); 
     mCam.setParameters(parameters); 
    } 

    //start preview of camera 
     mCam.startPreview(); 
    } 

XML文件(你做了一个小副本&粘贴错误)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
    /> 

希望我可以帮助:) 我认为,通过设置方向,您可以将相机图片更改为纵向模式。 :)(它现在是风景)

+1

嗨,已经设法解决我的问题的seom - 基本上关闭SurfaceChanged()中的所有东西,但你的泥土是非常漂亮的。今天晚上将花费在它上面,以确保我能够正确理解它,然后再实施它。因为它是人类交互实验的一部分,所以请在纵向视图中设置相机。非常感谢您的反馈,谢谢。 – LenseOnLife 2011-01-27 15:39:12

1

看看ApiDemos(Graphics-> CameraPreview)和类CameraPreview。这就是我所做的(所有的ApiDemos都很棒),它的功能就像一个魅力。先做好一件事情是件好事 - 然后你可以将它从你的应用中不需要的东西上剥离下来。演示也在线:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html。希望有所帮助。

+0

不能同意你的看法,有很多东西需要说明,不要在空白屏幕上查看,更糟糕的是,在源代码中加载小红X.快速浏览示例代码,不知道我以前错过了它 - 它非常全面,照顾的情况下,我永远不会想到。非常感谢,我们需要更多的学习,并感谢大量的正确指导。奥利弗 – LenseOnLife 2011-01-27 15:45:47

0

说实话,我认为整个相机预览处理“手工”过于复杂。 如果您只是想拍摄照片并首先进行预览,则可以通过Intent将此系统告知该系统。我写了一个关于这个职位前一段时间http://javablogs.com/Jump.action?id=618025 基本上有云:

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 1); 

然后你的活动中,你可以得到的数据在onActivityResult()回调

@Override 
public void onActivityResult(int requestCode, int resultCode,Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode==1&& resultCode==RESULT_OK) { 
    Bitmap bitmap = (Bitmap) data.getExtras().get("data"); 
    } 
} 

如果你需要一个更大的图像比默认,看看MediaStore.EXTRA_OUTPUT