0

我写了下面的代码,它编译得很好,但问题是它没有拍任何照片。我已经按照 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但这在我的应用程序中不是必需的,所以我没有使用它。


更新:

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

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

问候

4

2 回答 2

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);
    }

}

希望这有帮助

于 2013-06-13T20:20:02.473 回答
0

我知道我可以使用相机活动拍照,但这在我的应用程序中不是必需的,所以我没有使用它。

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

有什么我想念的吗?

  • 您没有预览窗格
  • 您尚未通过Camera.Parameters
  • 您尚未通过Camera.Parameters

我究竟做错了什么?

除了上述之外,您还打开了Camera两次,而忽略了第二次——您可能想要删除cam.open(0).

于 2013-06-13T20:33:25.903 回答