Android自定义照相机实现_第1页
Android自定义照相机实现_第2页
Android自定义照相机实现_第3页
Android自定义照相机实现_第4页
Android自定义照相机实现_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、最新Android自定义照相机实现Android自定义照相机实现拍照、保存到SD卡,利用Bundle在Acitivity交换数据 分类: 【Android多媒体开发系列】 【Android开发学习之路】 2022-05-14 21:36 12172人阅读 HYPERLINK :/ l comments 评论(14) 收藏 HYPERLINK :/ l report o 举报 举报 ANDROIDAndroid自定义照相机实现近期小巫在学校有一个创新工程,也不是最近,是一个拖了很久的工程,之前一直没有去搞,最近因为要中期检查,搞得我跟小组成员一阵忙活,其实开发一款照相机软件并不太难,下面就是通过

2、自定义的方式来实现 照相的功能。创立一个工程:FingerTakePicture首先来搞一下界面:html view plaincopyprint? 界面效果无法把预览给截屏下来滴: 权限设置少不了:html view plaincopyprint? 主Activity: java view plaincopyprint? package;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;import;imp

3、ort;import;import;/*Android手指拍照*authorwwj*date2022/4/29*/publicclassMainActivityextendsActivityprivateViewlayout;privateCameracamera;privateCamera.Parametersparameters=null;Bundlebundle=null;/声明一个Bundle对象,用来存储数据OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);/显

4、示界面setContentView();layout=this.findViewById();SurfaceViewsurfaceView=(SurfaceView)this.findViewById();surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surfaceView.getHolder().setFixedSize(176,144);/设置Surface分辨率surfaceView.getHolder().setKeepScreenOn(true);/屏幕常亮surfaceView.ge

5、tHolder().addCallback(newSurfaceCallback();/为SurfaceView的句柄添加一个回调函数/*按钮被点击触发的事件*paramv*/publicvoidbtnOnclick(Viewv)if(camera!=null)switch(v.getId()case:/拍照camera.takePicture(null,null,newMyPictureCallback();break;/*图片被点击触发的时间*paramv*/publicvoidimageClick(Viewv)if(v.getId()=)if(bundle=null)Toast.make

6、Text(getApplicationContext(),R.string.takephoto,Toast.LENGTH_SHORT).show();elseIntentintent=newIntent(this,ShowPicActivity.class);intent.putExtras(bundle);startActivity(intent);privatefinalclassMyPictureCallbackimplementsPictureCallbackOverridepublicvoidonPictureTaken(bytedata,Cameracamera)trybundle

7、=newBundle();bundle.putByteArray(bytes,data);/将图片字节数据保存在bundle当中,实现数据交换saveToSDCard(data);/保存图片到sd卡中Toast.makeText(getApplicationContext(),R.string.success,Toast.LENGTH_SHORT).show();camera.startPreview();/拍完照后,重新开始预览catch(Exceptione)e.printStackTrace();/*将拍下来的照片存放在SD卡中*paramdata*throwsIOException*/

8、publicstaticvoidsaveToSDCard(bytedata)throwsIOExceptionDatedate=newDate();SimpleDateFormatformat=newSimpleDateFormat(yyyyMMddHHmmss);/格式化时间Stringfilename=format.format(date)+.jpg;FilefileFolder=newFile(Environment.getExternalStorageDirectory()+/finger/);if(!fileFolder.exists()/如果目录不存在,那么创立一个名为finger

9、的目录fileFolder.mkdir();FilejpgFile=newFile(fileFolder,filename);FileOutputStreamoutputStream=newFileOutputStream(jpgFile);/文件输出流outputStream.write(data);/写入sd卡中outputStream.close();/关闭输出流privatefinalclassSurfaceCallbackimplementsCallback/拍照状态变化时调用该方法OverridepublicvoidsurfaceChanged(SurfaceHolderholde

10、r,intformat,intwidth,intheight)parameters=camera.getParameters();/获取各项参数parameters.setPictureFormat(PixelFormat.JPEG);/设置图片格式parameters.setPreviewSize(width,height);/设置预览大小parameters.setPreviewFrameRate(5);/设置每秒显示4帧parameters.setPictureSize(width,height);/设置保存的图片尺寸parameters.setJpegQuality(80);/设置照片

11、质量/开始拍照时调用该方法OverridepublicvoidsurfaceCreated(SurfaceHolderholder)trycamera=Camera.open();/翻开摄像头camera.setPreviewDisplay(holder);/设置用于显示拍照影像的SurfaceHolder对象camera.setDisplayOrientation(getPreviewDegree(MainActivity.this);camera.startPreview();/开始预览catch(Exceptione)e.printStackTrace();/停止拍照时调用该方法Over

12、ridepublicvoidsurfaceDestroyed(SurfaceHolderholder)if(camera!=null)camera.release();/释放照相机camera=null;/*点击 屏幕是,显示两个按钮*/OverridepublicbooleanonTouchEvent(MotionEventevent)switch(event.getAction()caseMotionEvent.ACTION_DOWN:layout.setVisibility(ViewGroup.VISIBLE);/设置视图可见break;returntrue;Overridepublic

13、booleanonKeyDown(intkeyCode,KeyEventevent)switch(keyCode)caseKeyEvent.KEYCODE_CAMERA:/按下拍照按钮if(camera!=null&event.getRepeatCount()=0)/拍照/注:调用takePicture()方法进行拍照是传入了一个PictureCallback对象当程序获取了拍照所得的图片数据之后/,PictureCallback对象将会被回调,该对象可以负责对相片进行保存或传入网络camera.takePicture(null,null,newMyPictureCallback();retu

14、rnsuper.onKeyDown(keyCode,event);/提供一个静态方法,用于根据 方向获得相机预览画面旋转的角度publicstaticintgetPreviewDegree(Activityactivity)/获得 的方向introtation=activity.getWindowManager().getDefaultDisplay().getRotation();intdegree=0;/根据 的方向计算相机预览画面应该选择的角度switch(rotation)caseSurface.ROTATION_0:degree=90;break;caseSurface.ROTATI

15、ON_90:degree=0;break;caseSurface.ROTATION_180:degree=270;break;caseSurface.ROTATION_270:degree=180;break;returndegree;package com.wwj.finger;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Activ

16、ity;import android.content.Intent;import android.graphics.PixelFormat;import android.hardware.Camera;import android.hardware.Camera.PictureCallback;import android.os.Bundle;import android.os.Environment;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.Surface;import a

17、ndroid.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.view.ViewGroup;import android.widget.Toast;/* * Android手指拍照 * * author wwj * date 2022/4/29 */public class MainActivity extends Activity private View layout;pr

18、ivate Camera camera;private Camera.Parameters parameters = null;Bundle bundle = null; / 声明一个Bundle对象,用来存储数据Overridepublic void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);/ 显示界面setContentView(R.layout.activity_main);layout = this.findViewById(R.id.buttonLayout);SurfaceView

19、 surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);surfaceView.getHolder().setFixedSize(176, 144);/设置Surface分辨率surfaceView.getHolder().setKeepScreenOn(true);/ 屏幕常亮surfaceView.getHolder().addCallback(new SurfaceCal

20、lback();/为SurfaceView的句柄添加一个回调函数/* * 按钮被点击触发的事件 * * param v */public void btnOnclick(View v) if (camera != null) switch (v.getId() case R.id.takepicture:/ 拍照camera.takePicture(null, null, new MyPictureCallback();break;/* * 图片被点击触发的时间 * * param v */public void imageClick(View v) if (v.getId() = R.id.

21、scalePic) if (bundle = null) Toast.makeText(getApplicationContext(), R.string.takephoto,Toast.LENGTH_SHORT).show(); else Intent intent = new Intent(this, ShowPicActivity.class);intent.putExtras(bundle);startActivity(intent);private final class MyPictureCallback implements PictureCallback Overridepub

22、lic void onPictureTaken(byte data, Camera camera) try bundle = new Bundle();bundle.putByteArray(bytes, data);/将图片字节数据保存在bundle当中,实现数据交换saveToSDCard(data); / 保存图片到sd卡中Toast.makeText(getApplicationContext(), R.string.success,Toast.LENGTH_SHORT).show();camera.startPreview(); / 拍完照后,重新开始预览 catch (Except

23、ion e) e.printStackTrace();/* * 将拍下来的照片存放在SD卡中 * param data * throws IOException */public static void saveToSDCard(byte data) throws IOException Date date = new Date();SimpleDateFormat format = new SimpleDateFormat(yyyyMMddHHmmss); / 格式化时间String filename = format.format(date) + .jpg;File fileFolder

24、= new File(Environment.getExternalStorageDirectory()+ /finger/);if (!fileFolder.exists() / 如果目录不存在,那么创立一个名为finger的目录fileFolder.mkdir();File jpgFile = new File(fileFolder, filename);FileOutputStream outputStream = new FileOutputStream(jpgFile); / 文件输出流outputStream.write(data); / 写入sd卡中outputStream.cl

25、ose(); / 关闭输出流private final class SurfaceCallback implements Callback / 拍照状态变化时调用该方法Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height) parameters = camera.getParameters(); / 获取各项参数parameters.setPictureFormat(PixelFormat.JPEG); / 设置图片格式parameters.setPreviewSize

26、(width, height); / 设置预览大小parameters.setPreviewFrameRate(5);/设置每秒显示4帧parameters.setPictureSize(width, height); / 设置保存的图片尺寸parameters.setJpegQuality(80); / 设置照片质量/ 开始拍照时调用该方法Overridepublic void surfaceCreated(SurfaceHolder holder) try camera = Camera.open(); / 翻开摄像头camera.setPreviewDisplay(holder); /

27、设置用于显示拍照影像的SurfaceHolder对象camera.setDisplayOrientation(getPreviewDegree(MainActivity.this);camera.startPreview(); / 开始预览 catch (Exception e) e.printStackTrace();/ 停止拍照时调用该方法Overridepublic void surfaceDestroyed(SurfaceHolder holder) if (camera != null) camera.release(); / 释放照相机camera = null;/* * 点击 屏

28、幕是,显示两个按钮 */Overridepublic boolean onTouchEvent(MotionEvent event) switch (event.getAction() case MotionEvent.ACTION_DOWN:layout.setVisibility(ViewGroup.VISIBLE); / 设置视图可见break;return true;Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) switch (keyCode) case KeyEvent.KEYCODE_CAMERA: /

29、按下拍照按钮if (camera != null & event.getRepeatCount() = 0) / 拍照/注:调用takePicture()方法进行拍照是传入了一个PictureCallback对象当程序获取了拍照所得的图片数据之后/,PictureCallback对象将会被回调,该对象可以负责对相片进行保存或传入网络camera.takePicture(null, null, new MyPictureCallback();return super.onKeyDown(keyCode, event);/ 提供一个静态方法,用于根据 方向获得相机预览画面旋转的角度public s

30、tatic int getPreviewDegree(Activity activity) / 获得 的方向int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();int degree = 0;/ 根据 的方向计算相机预览画面应该选择的角度switch (rotation) case Surface.ROTATION_0:degree = 90;break;case Surface.ROTATION_90:degree = 0;break;case Surface.ROTATION_180:deg

31、ree = 270;break;case Surface.ROTATION_270:degree = 180;break;return degree;用来显示图片的Activity:java view plaincopyprint? package;import;import;import;import;import;import;import;publicclassShowPicActivityextendsActivityprivateImageViewivPic=null;/显示图片控件/*Activity在创立的时候回调的函数主要用来初始化一些变量*/Overrideprotected

32、voidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView();ivPic=(ImageView)findViewById();setImageBitmap(getImageFormBundle();/*将MainActivity传过来的图片显示在界面当中*parambytes*/publicvoidsetImageBitmap(bytebytes)BitmapcameraBitmap=byte2Bitmap();/根据拍摄的方向旋转图像纵向拍摄时要需要将图像选择90度)Matr

33、ixmatrix=newMatrix();matrix.setRotate(MainActivity.getPreviewDegree(this);cameraBitmap=Bitmap.createBitmap(cameraBitmap,0,0,cameraBitmap.getWidth(),cameraBitmap.getHeight(),matrix,true);ivPic.setImageBitmap(cameraBitmap);/*从Bundle对象中获取数据*return*/publicbytegetImageFormBundle()Intentintent=getIntent()

34、;Bundledata=intent.getExtras();bytebytes=data.getByteArray(bytes);returnbytes;/*将字节数组的图形数据转换为Bitmap*return*/privateBitmapbyte2Bitmap()bytedata=getImageFormBundle();/将byte数组转换成Bitmap对象Bitmapbitmap=BitmapFactory.decodeByteArray(data,0,data.length);returnbitmap;package com.wwj.finger;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.os.Bundle;import android.widget.ImageView;public class ShowPicActivity extends Ac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论