如何捕捉图像,并将其保存在SD卡 [英] How to capture the image and save it in sd card

查看:125
本文介绍了如何捕捉图像,并将其保存在SD卡的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿,大家好我用下面的code,从我的应用程序访问的摄像头。 该应用程序能够访问摄像机我还增加了其onclicklistener增加了此行的code按钮: -

  camera.takePicture(mShutterCallback,mPictureCallbackRaw,mPictureCallbackJpeg);
 

现在我不知道会发生什么,但应用程序卡住我必须强制关闭它,然后我甚至不能访问本机摄像头的应用程序。 我认为它使应用程序不释放Camera对象。 加上形象永远不会被保存。

code: -

  SurfaceHolder持有人;
SurfaceView表面;
摄像头摄像头;
布尔值是previewRunning,fromOnResume;
// preVIEW米preVIEW;
/ **第一次创建活动时调用。 * /
@覆盖
公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.main);
    为previewRunning = FALSE;
    fromOnResume = FALSE;
   // requestWindowFeature(Window.FEATURE_NO_TITLE);
    表面=(SurfaceView)findViewById(R.id.surface);
    支架= surface.getHolder();
  holder.addCallback(本);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  按钮BTN =(按钮)findViewById(R.id.click);
    btn.setOnClickListener(新OnClickListener(){

        @覆盖
        公共无效的onClick(视图v){
            // TODO自动生成方法存根
            camera.takePicture(mShutterCallback,mPictureCallbackRaw,mPictureCallbackJpeg);
            //的onCreate(空);


        }

    });

}


@覆盖
公共无效surfaceChanged(SurfaceHolder持有人,INT格式,诠释的宽度,
        INT高度){
/ *如果(是previewRunning){
          camera.stop preVIEW();
         } * /

    Camera.Parameters参数= camera.getParameters();

    名单<大小>大小= parameters.getSupported previewSizes();
    尺寸尺寸= sizes.get(0);
    parameters.set previewSize(size.width,size.height);

    camera.setParameters(参数);
     camera.start preVIEW();
     为previewRunning = TRUE;
}
@覆盖
公共无效surfaceCreated(SurfaceHolder持有者){
    // TODO自动生成方法存根

     相机= Camera.open();

     尝试 {
        camera.set previewDisplay(保持器);
    }赶上(IOException异常E){
        // TODO自动生成的catch块
        e.printStackTrace();

    }
}
@覆盖
公共无效surfaceDestroyed(SurfaceHolder持有者){
    // TODO自动生成方法存根

    camera.stop preVIEW();
    camera.release();
    摄像头= NULL;
}

 Camera.PictureCallback mPictureCallbackRaw =新Camera.PictureCallback(){
 公共无效onPictureTaken(byte []的数据,摄像机C){
  Log.e(的getClass()getSimpleName(),PICTURE回调RAW:+数据);
  camera.start preVIEW();
 }
 };

 Camera.PictureCallback mPictureCallbackJpeg =新Camera.PictureCallback(){
 公共无效onPictureTaken(byte []的数据,摄像机C){
  Log.e(的getClass()getSimpleName(),PICTURE CALLBACK JPEG:data.length =+数据);

  camera.start preVIEW();
 }
 };


 Camera.ShutterCallback mShutterCallback =新Camera.ShutterCallback(){
 公共无效onShutter(){
 Log.e(的getClass()getSimpleName(),快门回调。);
 }
 };
/ *
 *保护无效onRestoreInstanceState(包savedInstanceState)
 {

 super.onRestoreInstanceState(savedInstanceState);
 }
 保护无效onResume()
 {

 Log.e(的getClass()getSimpleName(),onResume。);
 camera.open();
 fromOnResume = TRUE;
 super.onResume();
 }

 保护无效的onSaveInstanceState(包outState)
 {
 super.onSaveInstanceState(outState);
 }

 @覆盖
保护无效的onPause(){
    // TODO自动生成方法存根
     camera.release();
    super.onPause();
}


 保护无效的onStop()
 {
 Log.e(的getClass()getSimpleName(),的onStop。);
 super.onStop();
 } * /
 

解决方案

我知道这是不完全的回答你的问题,但wouldn'nt它更容易使用股票摄像头应用程序?您可以使用此code。在您的活动访问:

  @覆盖
公共无效的onCreate(包savedInstanceState)
{
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.capture);

    按钮捕捉=(按钮)findViewById(R.id.capture_button);
    capture.setOnClickListener(新View.OnClickListener(){
        @覆盖
        公共无效的onClick(视图v){

            //我们用股票相机应用程序来拍摄照片
            意向意图=新的意图(MediaStore.ACTION_IM​​AGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT,getImageUri());
            startActivityForResult(意向,TAKE_PHOTO_ code);
        }
    });
}

@覆盖
保护无效onActivityResult(INT申请code,INT结果code,意图数据){
    super.onActivityResult(要求code,因此code,数据);

    如果(要求code == TAKE_PHOTO_ code和;&安培;结果code == RESULT_OK){
        开放的我们的ImagePath = getImageUri();

        做一点事();
    }
}

/ **
 *获取捕获的文件的URI
 返回:一个Uri哪一条路径是一个映像文件的路径,存储在DCIM文件夹
 * /
私人乌里getImageUri(){
    在DCIM //店面形象
    档案文件=新的文件(Environment.getExternalStorageDirectory()+/ DCIM,CAPTURE_TITLE);
    乌里imgUri = Uri.fromFile(文件);

    返回imgUri;
}
 

hey guys i am using the following code to access camera from my application. The application is able to access the camera i have also added a button whose onclicklistener adds this line of code :-

camera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg);

Now i dont know what happens but the application gets stuck i have to force close it and then i can not even access the native camera application. I think it leaves the application without releasing the Camera object. Plus the image never gets saved.

Code :-

SurfaceHolder holder;
SurfaceView  surface;
Camera camera;
Boolean isPreviewRunning, fromOnResume;
//Preview mpreview;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    isPreviewRunning = false;
    fromOnResume = false;
   // requestWindowFeature(Window.FEATURE_NO_TITLE);
    surface = (SurfaceView)findViewById(R.id.surface);
    holder = surface.getHolder();
  holder.addCallback(this);
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

  Button btn = (Button)findViewById(R.id.click);
    btn.setOnClickListener(new OnClickListener(){

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            camera.takePicture(mShutterCallback, mPictureCallbackRaw, mPictureCallbackJpeg);
            //onCreate(null);


        }

    });

}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
/*  if (isPreviewRunning) {  
          camera.stopPreview();  
         }  */

    Camera.Parameters parameters = camera.getParameters();

    List<Size> sizes = parameters.getSupportedPreviewSizes();
    Size size = sizes.get(0);
    parameters.setPreviewSize(size.width, size.height);

    camera.setParameters(parameters);
     camera.startPreview();  
     isPreviewRunning=true;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub

     camera = Camera.open();

     try {
        camera.setPreviewDisplay(holder);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    }
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

    camera.stopPreview();
    camera.release();
    camera=null;
}

 Camera.PictureCallback mPictureCallbackRaw = new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera c) {
  Log.e(getClass().getSimpleName(), "PICTURE CALLBACK RAW: " + data);
  camera.startPreview();
 }
 };

 Camera.PictureCallback mPictureCallbackJpeg= new Camera.PictureCallback() {
 public void onPictureTaken(byte[] data, Camera c) {
  Log.e(getClass().getSimpleName(), "PICTURE CALLBACK JPEG: data.length = " + data);

  camera.startPreview();
 }
 };


 Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback() {
 public void onShutter() {
 Log.e(getClass().getSimpleName(), "SHUTTER CALLBACK");
 }
 };
/*
 *  protected void onRestoreInstanceState(Bundle savedInstanceState)
 {

 super.onRestoreInstanceState(savedInstanceState);
 }
 protected void onResume()
 {

 Log.e(getClass().getSimpleName(), "onResume");
 camera.open();
 fromOnResume=true;
 super.onResume();
 }

 protected void onSaveInstanceState(Bundle outState)
 {
 super.onSaveInstanceState(outState);
 }

 @Override
protected void onPause() {
    // TODO Auto-generated method stub
     camera.release();
    super.onPause();
}


 protected void onStop()
 {
 Log.e(getClass().getSimpleName(), "onStop");
 super.onStop();
 }*/

解决方案

I know this isn't exactly an answer to your question, but wouldn'nt it be easier to use the stock camera application? You can access it using this code in your activity:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.capture);

    Button capture = (Button) findViewById(R.id.capture_button);
    capture.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            // We use the stock camera app to take a photo
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
            startActivityForResult(intent, TAKE_PHOTO_CODE);
        }
    });
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) {
        Uri imagePath = getImageUri();

        doSomething();
    }
}

/**
 * Get the uri of the captured file
 * @return A Uri which path is the path of an image file, stored on the dcim folder
 */
private Uri getImageUri() {
    // Store image in dcim
    File file = new File(Environment.getExternalStorageDirectory() + "/DCIM", CAPTURE_TITLE);
    Uri imgUri = Uri.fromFile(file);

    return imgUri;
}

这篇关于如何捕捉图像,并将其保存在SD卡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆