如何通过触摸表面视图捕获图像

时间:2013-12-10 07:21:56

标签: java android

public class AndroidCamera extends Activity implements OnTouchListener, SurfaceHolder.Callback{

Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;;
PictureCallback rawCallback;
ShutterCallback shutterCallback;
PictureCallback jpegCallback;



EditText txtData, Info,Age;


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

   Button buttonStartCameraPreview = (Button)findViewById(R.id.startcamerapreview);
   Button buttonStopCameraPreview = (Button)findViewById(R.id.stopcamerapreview);
   Button buttonCapturePreview = (Button) findViewById(R.id.capturepreview);



    txtData = (EditText) findViewById(R.id.editText1);
   Info = (EditText) findViewById(R.id.Name);
    Info.setHint("enter  name");
    Age = (EditText) findViewById(R.id.Age);
    Age.setHint("Age");



    getWindow().setFormat(PixelFormat.UNKNOWN);
    surfaceView = (SurfaceView)findViewById(R.id.surfaceview);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);




    rawCallback = new PictureCallback() 
    {
        public void onPictureTaken(byte[] data, Camera camera)
        {
            Log.d("Log", "onPictureTaken - raw");
        }
    };

    shutterCallback = new ShutterCallback()
    {
        public void onShutter() {
            Log.i("Log", "onShutter'd");
        }
    };

  //  onTouchEvent(null);

    jpegCallback = new PictureCallback()
    {
        public void onPictureTaken(byte[] data, Camera camera) 
         {

            Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            File imagesFolder = new File(Environment.getExternalStorageDirectory(), "Asw");
            imagesFolder.mkdirs(); 
            Date d = new Date();
            CharSequence s  = DateFormat.format("MM-dd-yy hh-mm-ss", d.getTime());
            File output = new File(imagesFolder, s.toString() + ".jpg");

            Uri uriSavedImage = Uri.fromFile(output);
            imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
            OutputStream imageFileOS;

            try {
                imageFileOS = getContentResolver().openOutputStream(uriSavedImage);
                imageFileOS.write(data);
                imageFileOS.flush();
                imageFileOS.close();

                Toast.makeText(AndroidCamera.this, 
                        "Image saved: ", 
                        Toast.LENGTH_LONG).show();

                } 
            catch (FileNotFoundException e) 
                {
                e.printStackTrace();
                } 
            catch (IOException e)
            {
                e.printStackTrace();
            } 
            finally
            {}
            Log.d("Log", "onPictureTaken - jpeg");
        }
    };

    buttonStartCameraPreview.setOnClickListener(new Button.OnClickListener()
    {

        @TargetApi(Build.VERSION_CODES.GINGERBREAD)
        @Override
        public void onClick(View v) 
        {
            if(!previewing)
            {
                camera = Camera.open(0);
                if (camera != null)
                {

                    try {

                        camera.setPreviewDisplay(surfaceHolder);
                        camera.startPreview();
                        previewing = true;
                        } 
                    catch (IOException e) 
                        {

                        e.printStackTrace();
                        }
                }else txtData.setText("null");
            }
        }});



    buttonCapturePreview.setOnClickListener(new OnClickListener()
   {

        @Override
        public void onClick(View v) 
        {

            captureImage();
        }

        private void captureImage() 
        {
            camera.takePicture(shutterCallback, rawCallback, jpegCallback);

        }
    });
    buttonStopCameraPreview.setOnClickListener(new Button.OnClickListener(){

        @Override
        public void onClick(View v) 
        {

            if(camera != null && previewing)
            {
                camera.stopPreview();
                camera.release();
                camera = null;

                previewing = false;
            }
        }});




@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.android_camera, menu);
    return true;
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) 
{
    // TODO Auto-generated method stub

}


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

}


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

}




public boolean onTouch(View v, MotionEvent event)
{

    if (event.getAction() == MotionEvent.ACTION_MOVE)
    {
    camera.takePicture(shutterCallback, rawCallback, jpegCallback);

    }
    return super.onTouchEvent(event);

    //return false;
}

我使用了一个按钮来捕捉图像。现在我只想触摸表面视图就可以拍摄并保存图像。我写了一些代码。它没有显示任何错误,但它也没有工作。你能告诉我我哪里出错了。请帮忙

2 个答案:

答案 0 :(得分:1)

尝试以编程方式拍摄屏幕截图...

// image naming and path  to include sd card  appending name you choose for file
String mPath = Environment.getExternalStorageDirectory().toString() + "/" + ACCUWX.IMAGE_APPEND;   

// create bitmap screen capture
Bitmap bitmap;
View v1 = mCurrentUrlMask.getRootView();
v1.setDrawingCacheEnabled(true);
bitmap = Bitmap.createBitmap(v1.getDrawingCache());
v1.setDrawingCacheEnabled(false);

OutputStream fout = null;
imageFile = new File(mPath);

try {
    fout = new FileOutputStream(imageFile);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
    fout.flush();
    fout.close();

} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

答案 1 :(得分:1)

public class SnapShot extends Activity implements OnClickListener,
        SurfaceHolder.Callback, Camera.PictureCallback {

    SurfaceView cameraView;
    SurfaceHolder surfaceHolder;
    Camera camera;
    LayoutInflater inflater;
    Uri imageFileUri;
    Button save;
    Button retry;
    View viewControl;
    LayoutParams layoutParamsControl;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view_camera);

        cameraView = (SurfaceView) this.findViewById(R.id.CameraView);
        surfaceHolder = cameraView.getHolder();
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surfaceHolder.addCallback(this);

        cameraView.setFocusable(true);
        cameraView.setFocusableInTouchMode(true);
        cameraView.setClickable(true);
        cameraView.setOnClickListener(this);

        inflater = LayoutInflater.from(getBaseContext());
        viewControl = inflater.inflate(R.layout.camera_control, null);
        save = (Button) viewControl.findViewById(R.id.vc_btn_keep);
        retry = (Button)viewControl.findViewById(R.id.vc_btn_discard);
        layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);



    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        camera.startPreview();
    }

    public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
        try {
            Camera.Parameters parameters = camera.getParameters();
            if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE) {
                // This is an undocumented although widely known feature
                parameters.set("orientation", "portrait");
                // For Android 2.2 and above
                camera.setDisplayOrientation(90);
                // Uncomment for Android 2.0 and above
                // parameters.setRotation(90);
            } else {
                // This is an undocumented although widely known feature
                parameters.set("orientation", "landscape");
                // For Android 2.2 and above
                camera.setDisplayOrientation(0);
                // Uncomment for Android 2.0 and above
                // parameters.setRotation(0);
            }
            camera.setParameters(parameters);
            camera.setPreviewDisplay(holder);
        } catch (IOException exception) {
            camera.release();
            Log.v("surfaceCreated", exception.getMessage());
        }
        camera.startPreview();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {

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

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


         this.addContentView(viewControl, layoutParamsControl);



            save.setOnClickListener(new Button.OnClickListener() {

                @Override
                public void onClick(View v) {

                    insertImage(data);
                    Intent i = new Intent();
                    i.putExtra("data", imageFileUri.toString());
                    setResult(-1, i);
                    finish();
                }});


        retry.setOnClickListener(new Button.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                finish();
            }});


    }

    public void insertImage(byte[] data)
    {

        Bitmap b = null;
        try {
            b = GeneralUtils.decodeFile(data, this);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        b.compress(Bitmap.CompressFormat.JPEG, 80, bos);
        //b = null;
        Bitmap bitmap = BitmapFactory.decodeByteArray(bos.toByteArray(), 0, bos.size());
        Matrix m = new Matrix();
        if (b.getWidth() > b.getHeight())
        {
            m.postRotate(90);
            bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);

        }
        String result = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "", "");
        b.recycle();
        data = null;
        b = null;
        m = null; 

        imageFileUri = Uri.parse(result);

    }


    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        camera.takePicture(null, null, null, this);
    }

}