Android简单相机开发

来源:互联网 发布:矩阵半张量积等式的解 编辑:程序博客网 时间:2024/04/30 02:09

调用系统相机

1.调用系统相机

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent);

2.使应用具有相机功能
在AndroidMainifest.xml文件中的activity标签中加入下面的代码, 将会是应用具有相机功能,在其他应用调用第三方相机功能时,就会提示选择调用本应用的相机。

<intent-filter>          <action android:name="android.intent.action.IMAGE_CAPTURE"/>          <category android:name="android.intent.category.DEFAULT"/></intent-filter>

当然,相机具体的实现的功能还需要我们去通过代码实现。
3.拍照结束显示拍照的图片
需采用startActivityForResult()方法返回拍照结果。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent,1);

在Activity中添加复写onActivityResult()方法:

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode == RESULT_OK) {            if (requestCode == 1) {                Bundle bundle = data.getExtras();                Bitmap bitmap = (Bitmap) bundle.get("data");                //获取到的图片是缩略图                image.setImageBitmap(bitmap);            }        }    }

使用上述方法显示的图片是缩略图,如果需要显示原图,那如何实现呢?
可将拍照的图片存在sdcard中,然后显示出来。

//图片存放路径String path = Environment.getExternalStorageDirectory().getPath()+"/temp.png";
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);Uri uri = Uri.fromFile(new File(path));//将拍照的图片存放在指定路径,避免其存放在拍照默认路径,方便读取intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);startActivityForResult(intent,2);
@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (resultCode==RESULT_OK){            if(requestCode == 2){                FileInputStream inputStream = null;                try {                    inputStream = new FileInputStream(path);                    Bitmap bitmap  = BitmapFactory.decodeStream(inputStream);                    //获取到的图片是拍照原图                    image.setImageBitmap(bitmap);                } catch (FileNotFoundException e) {                    e.printStackTrace();                }finally {                    try {                        inputStream.close();                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }    }

在AndroidMainifest.xml文件中添加应用SD卡读写权限。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

自定义相机

1.实现自定义相机步骤
1)建立camera对象
2)建立SurfaceView对象
3)将camera对象和SurfaceView对象进行绑定
2.代码实现

public class CustomCameraActivity extends AppCompatActivity implements SurfaceHolder.Callback{    private Camera mCamera;    private SurfaceView surfaceView;    private SurfaceHolder holder;    private Camera.PictureCallback mPictureCallBack = new Camera.PictureCallback() {        @Override        public void onPictureTaken(byte[] data, Camera camera) {            File file = new File("/mnt/sdcard/temp.png");            try {                FileOutputStream outputStream = new FileOutputStream(file);                outputStream.write(data);                outputStream.close();                Intent intent = new Intent(CustomCameraActivity.this,ResultActivity.class);                intent.putExtra("path",file.getAbsolutePath());                finish();                startActivity(intent);            } catch (FileNotFoundException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_custom_camera);        surfaceView = (SurfaceView) findViewById(R.id.surface);        holder = surfaceView.getHolder();        holder.addCallback(this);        surfaceView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                mCamera.autoFocus(null);            }        });    }    @Override    protected void onResume() {        super.onResume();        if (mCamera == null){            mCamera = getCamera();            if (holder!=null){                setStartPreview(mCamera,holder);            }        }    }    @Override    protected void onPause() {        super.onPause();        releaseCamera();    }    public void capture(View v){        Camera.Parameters parameters = mCamera.getParameters();        //设置拍照模式        parameters.setPictureFormat(ImageFormat.JPEG);        //设置预览大小        parameters.setPreviewSize(800,400);        //将对焦模式设置为自动对焦        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);        mCamera.autoFocus(new Camera.AutoFocusCallback() {            @Override            public void onAutoFocus(boolean success, Camera camera) {                if (success){ //当对焦成功进行拍照                    mCamera.takePicture(null,null,mPictureCallBack);                }            }        });    }    /**     * 获取Camera对象     * @return     */    private Camera getCamera(){        Camera camera = Camera.open();        return camera;    }    /**     * 显示预览相机内容     */    private void setStartPreview(Camera camera,SurfaceHolder holder){        try {            camera.setPreviewDisplay(holder);            //系统默认的相机角度是横屏的,需将系统相机角度调整成竖屏            camera.setDisplayOrientation(90);            camera.startPreview();        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 释放相机资源     */    private void releaseCamera(){        if (mCamera!=null){            mCamera.setPreviewCallback(null);            mCamera.stopPreview();            mCamera.release();            mCamera = null;        }    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        setStartPreview(mCamera,holder);    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        mCamera.stopPreview();        setStartPreview(mCamera,holder);    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        releaseCamera();    }}

注意:上面使用的Camera类来自android.hardware.Camera。
布局文件:

<FrameLayout    xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <SurfaceView        android:id="@+id/surface"        android:layout_width="match_parent"        android:layout_height="match_parent" />    <ImageButton        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center_horizontal|bottom"        android:onClick="capture"        android:src="@drawable/capture" /></FrameLayout>

结果返回界面代码:

public class ResultActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_result);        ImageView imageView = (ImageView) findViewById(R.id.result_image);        String path = getIntent().getStringExtra("path");        try {            FileInputStream fileInputStream = new FileInputStream(path);            Bitmap bitmap = BitmapFactory.decodeStream(fileInputStream);            Matrix matrix = new Matrix();            //将图片旋转90°            matrix.setRotate(90);            bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);            imageView.setImageBitmap(bitmap);        } catch (FileNotFoundException e) {            e.printStackTrace();        }    }}

最后还有添加相机权限

<uses-permission android:name="android.permission.CAMERA" />

这种实现自定义相机的方法,如今已经过时,但用来开发简单的相机还是比较方便的。如今Android5.0提出了Camera V2,提供了更多功能,如果想要开发具有更多功能的相机,可是使用这种方法。但Camera V2要求手机SdkVersion要大于21,最小版本(minSdkVersion)升到21之前,你还是需要继续使用Camera API(android.hardware.Camera)。

0 0
原创粉丝点击