无法使用相机拍照

时间:2013-06-13 20:07:31

标签: java android camera

我已经编写了以下代码,它编译得很好,但问题是它没有拍任何图片。我已根据android文档的指示在清单文件中添加了权限和功能,但仍然由于某种原因应用程序没有拍照。 I am not getting any errors in logcat either.以下是代码。

public class StartingPoint extends Activity implements SurfaceHolder.Callback{

Camera cam;
Parameters param;
Bitmap imageTaken;

ImageView imView;

SurfaceView dummySurfaceView;

SurfaceHolder dummyHolder;

CamCallBack camCall ;

private static final String TAG = "CameraApp";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_starting_point);

    imView = (ImageView) findViewById(R.id.imageView);

    dummySurfaceView = (SurfaceView) findViewById(R.id.dummySurface);


    dummyHolder= dummySurfaceView.getHolder(); 

    dummyHolder.addCallback(StartingPoint.this); 
    dummyHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {

    param= cam.getParameters();

    cam.setParameters(param);

    cam.startPreview();

    cam.takePicture(null, null, camCall);

}
@Override
public void surfaceCreated(SurfaceHolder holder) {

    try
    {           
        if(cam.getNumberOfCameras()==2)
        {       
            cam.open(0);

            cam.setPreviewDisplay(dummySurfaceView.getHolder());

            camCall = new CamCallBack();

            Log.d(TAG,"Try to open camera");
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();

        Log.d(TAG,"camera opening failed");

        Log.e(TAG,"recieved Exception",e);
    }


}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

    cam.stopPreview();      
    cam.release(); 

    cam=null;
}


public class CamCallBack implements Camera.PictureCallback
{

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        imageTaken = BitmapFactory.decodeByteArray(data, 0, data.length); 
        imView.setImageBitmap(imageTaken);

        cam.release();


        Log.d(TAG,"Picture taken");
    }

}


 }

我做错了什么?有什么我想念的吗?

修改

我知道我可以使用Camera activity拍照,但我的应用不需要这样做,所以我没有使用它。


更新:

代码已更新。我在布局中添加了一个虚拟Surfaceview,其高度和宽度为0dp,但仍然无法使用该应用程序。

我们可以在不让用户知道已拍摄照片的情况下从服务中拍摄照片吗?

此致

2 个答案:

答案 0 :(得分:0)

我认为您可以使用Intent轻松尝试:

// at the beginning of your class
private static final int CAMERA_REQUEST = 1888; 

//call cam request
public void takePic(){
    Intent cameraIntent = new       Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(cameraIntent, CAMERA_REQUEST); 
}
//get photo taken
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == CAMERA_REQUEST){
                    ImageView photo = (ImageView) findViewById(R.id.yourpic);
        Bitmap photoprise = (Bitmap) data.getExtras().get("data"); 
        photo.setImageBitmap(photoprise);
    }

}

希望这个帮助

答案 1 :(得分:0)

  

我知道我可以使用相机活动拍照,但我的应用不需要这样,所以我没有使用它。

在这种情况下,使用基于Intent的解决方案是一个好主意。

  

我有什么遗失的吗?

  • 您没有预览窗格
  • 您尚未通过Camera.Parameters
  • 指定图片尺寸
  • 您尚未通过Camera.Parameters
  • 指定图片类型(例如JPEG)
  

我做错了什么?

除上述情况外,您打开Camera两次,忽略第二个 - 您可能要删除cam.open(0)