android 实现拍照的2种方法

android系统的照相功能,已实现2种方法,可供大家参考:

1.调用系统摄像头来拍照

首先,找到AndroidManifest.xml文件里加入用户权限

<uses-permission android:name="android.permission.CAMERA"></uses-permission>
 <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />

其次,在主类java文件里加入2个控件(button和imageview),是用来触发按钮事件和显示图片的,纯是个人爱好
final int TAKE_PICTURE = 1;//为了表示返回方法中辨识你的程序打开的相机
关键是这里:
startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE);
是打开系统自带相机,以下是处理拍照得到的数据,将数据保存下来

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if (requestCode == TAKE_PICTURE) {            if (resultCode == RESULT_OK) {                Bitmap bm = (Bitmap) data.getExtras().get("data");                img.setImageBitmap(bm);//想图像显示在ImageView视图上,private ImageView img;                File myCaptureFile = new File("sdcard/123456.jpg");                try {     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile));      /* 采用压缩转档方法 */           bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);                      /* 调用flush()方法,更新BufferStream */           bos.flush();                      /* 结束OutputStream */           bos.close();    } catch (FileNotFoundException e) {     // TODO Auto-generated catch block     e.printStackTrace();         } catch (IOException e) {     // TODO Auto-generated catch block     e.printStackTrace();    }            }        }}

这样就能实现调用系统自带的摄像头了,很简单的操作。

2.自己写程序来保存照片

照片格局文件lay.xml里要先进行这些定义

<?xml version="1.0" encoding="utf-8"?><LinearLayout  xmlns:android="[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android)"  android:orientation="vertical"  android:layout_width="fill_parent"  android:layout_height="fill_parent"><LinearLayout    android:orientation="horizontal"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:paddingLeft="130px"    android:paddingRight="200px"  >  <SurfaceView    android:id="@+id/mSurfaceView1"    android:visibility="visible"     android:layout_width="320px"     android:layout_height="240px">  </SurfaceView>   </LinearLayout>  </LinearLayout>

其中SurfaceView是用来进行预览的,
在Oncreat函数里初始化一系列的值:

 requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.lay);
 /* 取得屏幕解析像素 */     DisplayMetrics dm = new DisplayMetrics();     getWindowManager().getDefaultDisplay().getMetrics(dm);    // mImageView01 = (ImageView) findViewById(R.id.myImageView1);          /* 以SurfaceView作为相机Preview之用 */     mSurfaceView01 = (SurfaceView) findViewById(R.id.mSurfaceView1);          /* 绑定SurfaceView,取得SurfaceHolder对象 */     mSurfaceHolder01 = mSurfaceView01.getHolder();          /* Activity必须实现SurfaceHolder.Callback */     mSurfaceHolder01.addCallback(takephoto.this);          /*      * 以SURFACE_TYPE_PUSH_BUFFERS(3)      * 作为SurfaceHolder显示类型       * */     mSurfaceHolder01.setType     (SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

首先进行初始化照相机的功能函数和参数设置:

private Camera mCamera01;
mCamera01 = Camera.open();
 /* 创建Camera.Parameters对象 */    Camera.Parameters parameters = mCamera01.getParameters();             /* 设置相片格式为JPEG */    parameters.setPictureFormat(PixelFormat.JPEG);    Log.i(TAG, "pic is jpeg");             /* 指定preview的屏幕大小 */    parameters.setPreviewSize(320, 240);    Log.i(TAG, "pic pingmu fenbianlv");             /* 设置图片分辨率大小 */    parameters.setPictureSize(1024, 768);    Log.i(TAG, "pic tupian fenbianlv");             /* 将Camera.Parameters设置予Camera */    mCamera01.setParameters(parameters);             /* setPreviewDisplay唯一的参数为SurfaceHolder */    mCamera01.setPreviewDisplay(mSurfaceHolder01);             /* 立即运行Preview */    mCamera01.startPreview();
初始化成功后就可以进行拍照了,拍照函数依然是通过调用camera类的函数来实现
mCamera01.takePicture       (shutterCallback, rawCallback, jpegCallback);

只需实现jpegCallback这个回调函数来就行解码、保存即可,前2个参数可以直接设为null,不过系统一般会自动帮你把这些都写进来的

 private PictureCallback jpegCallback = new PictureCallback()    {     public void onPictureTaken(byte[] _data, Camera _camera)     {       // TODO Handle JPEG image data              /* onPictureTaken传入的第一个参数即为相片的byte */       Bitmap bm = BitmapFactory.decodeByteArray                   (_data, 0, _data.length);              /* 创建新文件 */              picname = "sdcard/1234566.jpg";//要保存在哪里,路径你自己设       File myCaptureFile = new File(picname);       try       {         BufferedOutputStream bos = new BufferedOutputStream         (new FileOutputStream(myCaptureFile));                  /* 采用压缩转档方法 */         bm.compress(Bitmap.CompressFormat.JPEG, 80, bos);                  /* 调用flush()方法,更新BufferStream */         bos.flush();                  /* 结束OutputStream */         bos.close();                  /* 将拍照下来且存储完毕的图文件,显示出来 */          //mImageView01.setImageBitmap(bm);                  /* 显示完图文件,立即重置相机,并关闭预览 */         resetCamera();                   }       catch (Exception e)       {         Log.e(TAG, e.getMessage());       }     }   };

拍照完了要重置照相机,然后可以继续拍照

/* 相机重置 */   private void resetCamera()   {     if (mCamera01 != null && bIfPreview)     {       mCamera01.stopPreview();       /* 扩展学习,释放Camera对象 */       mCamera01.release();       mCamera01 = null;       bIfPreview = false;     }   }

2 种拍照方式的比较

1.调用系统自带的照相机,照片格式大小只有几种选择,照片拍出来比较大,而自己程序实现的话可以调节照片大小为任意尺寸,图片的容量可以调节
2.调用系统的简单,而且外观一般比自己设置的要好看
3.调用系统的操作简单、方便,不易出错,自己编程的话需要注意,容易引起系统出错意外终止

转接:http://blog.csdn.net/napolun007/article/details/6103307

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,218评论 25 709
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,937评论 0 17
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,807评论 4 61
  • 我纯真可爱的孩子们,不久你们就要告别生活了六年的校园了。即便今天看上去你们真的好像没有什么感觉:你们依然按部就班地...
    雪落诗肩阅读 3,813评论 0 0
  • 在过去的一天里,我见过的最能应景的语言就是这句“在过去的一天里在社交网络上,论坛上,还有就是各个自媒体的转发中会涌...
    佩服佩服阅读 2,515评论 0 0

友情链接更多精彩内容