Android的两种拍照方法
16lz
2021-01-23
Android有两种拍照方法,一种是直接调用系统的照相Intent,使用 onActivityResult获取图片资源或者指定图片路径,拍照返回成功后去指定路径读取图片;一种是用SurfaceView自定义界面,添加业务个性化功能。
1、不管哪种拍照方法,首先,确认下权限:在AndroidManifest.xml文件中添加权限允许语句:
<uses-permission android:name="android.permission.CAMERA" />
2、调用系统的照相方法:
拍照代码:
- packagecom.ziyouku.camera;
- importjava.io.File;
- importandroid.app.Activity;
- importandroid.content.Intent;
- importandroid.net.Uri;
- importandroid.os.Bundle;
- importandroid.os.Environment;
- importandroid.provider.MediaStore;
- importandroid.util.Log;
- importcom.ziyouku.demo.R;
- publicclassPhotoActivityextendsActivity {
- privateString TAG ="PhotoActivity";
- @Override
- publicvoidonCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- try{
- Intent intent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
- File out =newFile(Environment.getExternalStorageDirectory(),
- "camera.jpg");
- Uri uri = Uri.fromFile(out);
- intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
- startActivityForResult(intent,0);
- }catch(Exception e) {
- e.printStackTrace();
- }
- }
- @Override
- protectedvoidonActivityResult(intrequestCode,intresultCode, Intent data) {
- try{
- Log.v(TAG,"onActivityResult requestCode = "+ requestCode +"; resultCode = "
- + resultCode);
- if(requestCode !=0) {
- return;
- }
- if(resultCode ==0) {
- finish();
- return;
- }
- Intent intent =newIntent();
- intent.setClass(this, ViewPhotoActivity.class);
- this.startActivity(intent);
- }catch(Exception e) {
- Log.v(TAG, e.getMessage());
- }
- }
- }
查看照片代码:
- packagecom.ziyouku.camera;
- importandroid.app.Activity;
- importandroid.app.AlertDialog;
- importandroid.content.DialogInterface;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.os.Bundle;
- importandroid.os.Environment;
- importandroid.util.Log;
- importandroid.view.MotionEvent;
- importandroid.widget.ImageView;
- importcom.ziyouku.demo.R;
- publicclassViewPhotoActivityextendsActivity {
- privateString TAG ="ViewPhotoActivity";
- privateAlertDialog alertDialog;
- privateImageView view;
- @Override
- protectedvoidonCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.camera);
- try{
- view = (ImageView) findViewById(R.id.image);
- String pathString = Environment.getExternalStorageDirectory()
- .toString() +"/camera.jpg";
- Log.v("","pathString = "+ pathString);
- Bitmap b = BitmapFactory.decodeFile(pathString);
- view.setImageBitmap(b);
- alertDialog =newAlertDialog.Builder(ViewPhotoActivity.this)
- .setMessage("ziyouku.com自由库测试demo")
- .setPositiveButton("ok",
- newDialogInterface.OnClickListener() {
- publicvoidonClick(DialogInterface dialog,
- intwhichButton) {
- }
- })
- .setNegativeButton("cancle",
- newDialogInterface.OnClickListener() {
- publicvoidonClick(DialogInterface dialog,
- intwhichButton) {
- }
- }).create();
- alertDialog.show();
- }catch(Exception e) {
- Log.v(TAG, e.getMessage());
- thrownewRuntimeException(e);
- }
- }
- @Override
- publicbooleanonTouchEvent(MotionEvent event) {
- Log.v(TAG,"onTouchEventevent = "+ event.getX());
- returnsuper.onTouchEvent(event);
- }
- }
- packagecom.ziyouku.camera;
- importjava.io.IOException;
- importcom.ziyouku.demo.R;
- importandroid.app.Activity;
- importandroid.content.pm.ActivityInfo;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.graphics.PixelFormat;
- importandroid.hardware.Camera;
- importandroid.hardware.Camera.AutoFocusCallback;
- importandroid.hardware.Camera.Parameters;
- importandroid.hardware.Camera.PictureCallback;
- importandroid.hardware.Camera.ShutterCallback;
- importandroid.os.Bundle;
- importandroid.util.Log;
- importandroid.view.KeyEvent;
- importandroid.view.SurfaceHolder;
- importandroid.view.SurfaceView;
- importandroid.view.View;
- importandroid.view.Window;
- importandroid.view.WindowManager;
- importandroid.view.SurfaceHolder.Callback;
- importandroid.view.View.OnClickListener;
- importandroid.widget.ImageView;
- publicclassCameraCustomextendsActivityimplementsCallback, OnClickListener {
- privateSurfaceView mSurfaceView;
- privateSurfaceHolder mSurfaceHolder;
- privateCamera mCamera;
- privatebooleanmPreviewRunning;
- privateImageView mImageView;
- @Override
- publicvoidonCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- this.requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFormat(PixelFormat.TRANSLUCENT);
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
- setContentView(R.layout.main);
- mSurfaceView = (SurfaceView) findViewById(R.id.camera);
- mImageView = (ImageView) findViewById(R.id.image);
- mImageView.setVisibility(View.GONE);
- mSurfaceView.setOnClickListener(this);
- mSurfaceHolder = mSurfaceView.getHolder();
- mSurfaceHolder.addCallback(this);
- mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
- }
- @Override
- publicvoidsurfaceChanged(SurfaceHolder holder,intformat,intwidth,
- intheight) {
- if(mPreviewRunning) {
- mCamera.stopPreview();
- }
- Parameters params = mCamera.getParameters();
- params.setPictureFormat(PixelFormat.JPEG);// 设置图片格式
- // params.setPreviewSize(width, height);
- params.set("rotation",90);
- mCamera.setParameters(params);
- try{
- mCamera.setPreviewDisplay(holder);
- }catch(IOException e) {
- e.printStackTrace();
- }
- mCamera.startPreview();
- mPreviewRunning =true;
- }
- privateAutoFocusCallback mAutoFocusCallBack =newAutoFocusCallback() {
- @Override
- publicvoidonAutoFocus(booleansuccess, Camera camera) {
- Log.v("AutoFocusCallback","AutoFocusCallback , boolean success:"+ success);
- Camera.Parameters Parameters = mCamera.getParameters();
- Parameters.setPictureFormat(PixelFormat.JPEG);// 设置图片格式
- mCamera.setParameters(Parameters);
- mCamera.takePicture(mShutterCallback,null, mPictureCallback);
- }
- };
- @Override
- publicvoidsurfaceCreated(SurfaceHolder holder) {
- mCamera = Camera.open();
- }
- @Override
- publicvoidsurfaceDestroyed(SurfaceHolder holder) {
- mCamera.stopPreview();
- mPreviewRunning =false;
- mCamera.release();
- mCamera =null;
- }
- /**
- * 拍照的回调接口
- */
- PictureCallback mPictureCallback =newPictureCallback() {
- @Override
- publicvoidonPictureTaken(byte[] data, Camera camera) {
- Log.v("PictureCallback","…onPictureTaken…");
- if(data !=null) {
- Bitmap bitmap = BitmapFactory.decodeByteArray(data,0,
- data.length);
- mImageView.setImageBitmap(bitmap);
- mImageView.setVisibility(View.VISIBLE);
- mSurfaceView.setVisibility(View.GONE);
- if(mPreviewRunning) {
- mCamera.stopPreview();
- mPreviewRunning =false;
- }
- }
- }
- };
- /**
- * 在相机快门关闭时候的回调接口,通过这个接口来通知用户快门关闭的事件,
- * 普通相机在快门关闭的时候都会发出响声.
- * 根据需要可以在该回调接口中定义各种动作, 例如:使设备震动
- */
- ShutterCallback mShutterCallback =newShutterCallback() {
- publicvoidonShutter() {
- // just log ,do nothing
- Log.v("ShutterCallback","…onShutter…");
- }
- };
- publicbooleanonKeyDown(intkeyCode, KeyEvent event) {
- if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
- if(mCamera !=null) {
- // mCamera.takePicture(null, null,mPictureCallback);
- mCamera.autoFocus(mAutoFocusCallBack);
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
- }
- }
- returnsuper.onKeyDown(keyCode, event);
- }
- @Override
- publicvoidonClick(View arg0) {
- Log.v("onClick","…onClick…");
- mCamera.autoFocus(mAutoFocusCallBack);
- }
- }
布局文件:
- <?xml version="1.0"encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <SurfaceView android:id="@+id/camera"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- <ImageView android:id="@+id/image"
- android:contentDescription="@string/app_name"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"/>
- </LinearLayout>
更多相关文章
- Qt for Android 调用android原生接口分享图片或文字
- Android中的数据传递之Parcelable接口
- AIDL (Android Interface Definition Language) Android 接口定
- Parcalable接口使用(android传递结构体数据的方法)
- android从网站获取json接口数据并放置到spinner
- ISurfaceComposer接口有13个成员函数