【问题标题】:Unable to take pictures using Camera无法使用相机拍照
【发布时间】:2013-06-14 18:29:50
【问题描述】:

我编写了以下代码,它编译得很好,但问题是它没有拍照。我已经按照 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,但应用程序仍然无法正常工作。

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

问候

【问题讨论】:

    标签: java android camera


    【解决方案1】:

    我认为您可以使用 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);
        }
    
    }
    

    希望有帮助

    【讨论】:

    • 我不想启动相机活动。我的应用不需要相机活动,所以我没有使用它。
    【解决方案2】:

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

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

    我有什么遗漏吗?

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

    我做错了什么?

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

    【讨论】:

    • 好的。即使我不想向用户展示拍摄的照片,我也必须使用预览窗格。我想用前置摄像头拍照
    猜你喜欢
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多