学做烘培的网站,郑州百度网站建设,金数字网站建设,深圳网络推广外包Android 自定义相机及分析源码使用Android 系统相机的方法#xff1a;要想让应用有相机的action#xff0c;咱们就必须在清单文件中做一些声明#xff0c;好让系统知道#xff0c;如下action的作用就是声明action的类型#xff0c;便于Intent的使用#xff0c;category的…Android 自定义相机及分析源码使用Android 系统相机的方法要想让应用有相机的action咱们就必须在清单文件中做一些声明好让系统知道如下action的作用就是声明action的类型便于Intent的使用category的作用就是注册没有它。相关操作将不起作用。一种方式是简单粗暴的实现如下Intent intentnew Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, REQ_1);//然后在 onActivityResult方法中实现数据的获取此处是展示在了一个ImageView上if(resultCodeRESULT_OK){if(requestCodeREQ_1){Bundle bundledata.getExtras();Bitmap bitmap(Bitmap) bundle.get(data);imageView.setImageBitmap(bitmap);}小总结这样的好处是简单快捷但是在现在的android智能机中好多相片都是很大的这里获得的仅仅是一个缩略图罢了另外一种方式是稍微温婉一点了而且效果也更好一点好处就在于它是先将照片信息存储到本地一个临时文件中然后让ImageView去相关路径下进行读取这样就可以获得清晰度很高的图片了。如下/** 此方法的存在意义就是不在onActivityResult方法的data中获取我们拍照的缩略图而是从我们的文件输出目录下直接查看原图* 这样的好处就是可以对大容量的照片进行便捷的准确的操作*/public void onStartCarema2(View view){Intent intentnew Intent(MediaStore.ACTION_IMAGE_CAPTURE);//见你给你路径传递回需要的处理方法中Uri uriUri.fromFile(new File(myFilePath));//设置文件的输出路径intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, REQ_2);}//然后在onActivityResult方法中进行相关的处理就可以了else if(requestCodeREQ_2){FileInputStream fisnull;try {fisnew FileInputStream(myFilePath);Bitmap bitmapBitmapFactory.decodeStream(fis);imageView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}//记得最后一定要关闭相关的流操作。否则会引起相关的异常的。开发自定义的相机由于开发自定义的相机要进行相关的权限的生命所以一定不要忘记在清单文件中做相关的处理如下然后有以下几个步骤创建Camera并完成初始化Camera开始预览释放资源三个方法与Activity的SurfaceView进行绑定。在系统的onPause(),onResume()方法中进行相关状态设置对Camera进行参数设置作用就是对照片类型和状态进行相关的设置将拍得的照片进行展示一般会新开一个Activity用ImageView进行承载我们还可以在此Activity上添加TextView实现水印效果等其他的美化操作另外如果想加入自动聚焦的功能就可以在SurfaceView上添加onClickListener()对屏幕进行侦听调用myCamera.autoFocus(null);方法即可以上就是整个思路接下来就是使用系统Camera的代码展示(可以直接copy相关代码块添加到你的应用中去实现Camera这一功能。)首先是MainActivity布局xmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:paddingBottomdimen/activity_vertical_marginandroid:paddingLeftdimen/activity_horizontal_marginandroid:paddingRightdimen/activity_horizontal_marginandroid:paddingTopdimen/activity_vertical_marginandroid:orientationverticaltools:context.MainActivity android:idid/startCaremaandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_margin6dpandroid:textStartCaremaandroid:onClickonStartCarema/android:idid/startCarema2android:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_margin6dpandroid:textStartCarema2android:onClickonStartCarema2/android:idid/customCaremaandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_margin6dpandroid:textCustomCaremaandroid:onClickonCustomCarema/android:idid/imageviewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent/代码package com.example.camerademo;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.view.View;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends Activity {//为下面的获取请求所用private static int REQ_11;private static int REQ_22;Button btn_startCareme,btn_startCarema2,btn_customCarema;ImageView imageView;//定义照片存储的路径private String myFilePath;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn_startCareme(Button) findViewById(R.id.startCarema);btn_startCarema2(Button) findViewById(R.id.startCarema2);btn_customCarema(Button) findViewById(R.id.customCarema);imageView(ImageView) findViewById(R.id.imageview);//初始化不同手机的SD卡的路径myFilePathEnvironment.getExternalStorageDirectory().getPath();myFilePathmyFilePath/temperature.png;}public void onCustomCarema(View view){Intent intentnew Intent(this,CustomCarema.class);startActivity(intent);}public void onStartCarema(View view){Intent intentnew Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, REQ_1);}/** 此方法的存在意义就是不在onActivityResult方法的data中获取我们拍照的缩略图而是从我们的文件输出目录下直接查看原图* 这样的好处就是可以对大容量的照片进行便捷的准确的操作*/public void onStartCarema2(View view){Intent intentnew Intent(MediaStore.ACTION_IMAGE_CAPTURE);//见你给你路径传递回需要的处理方法中Uri uriUri.fromFile(new File(myFilePath));//设置文件的输出路径intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, REQ_2);}Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if(resultCodeRESULT_OK){if(requestCodeREQ_1){Bundle bundledata.getExtras();Bitmap bitmap(Bitmap) bundle.get(data);imageView.setImageBitmap(bitmap);}else if(requestCodeREQ_2){FileInputStream fisnull;try {fisnew FileInputStream(myFilePath);Bitmap bitmapBitmapFactory.decodeStream(fis);imageView.setImageBitmap(bitmap);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{try {fis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}}接下来是自定义相机的代码主界面布局android:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationvertical android:idid/captureandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:layout_margin6dpandroid:textCaptureandroid:onClickonCapture/android:idid/previewandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent/ResultActivity的布局android:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationvertical android:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textCapture Resultandroid:textSize28dpandroid:textColor#BFAACDandroid:gravitycenter/android:idid/pictureandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:scaleTypecenter/代码首先是CustomCamera类package com.example.camerademo;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import android.app.Activity;import android.content.Intent;import android.graphics.ImageFormat;import android.hardware.Camera;import android.os.Bundle;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;SuppressWarnings(unused)public class CustomCarema extends Activity implements SurfaceHolder.Callback{private Camera myCamera;private SurfaceView preview;private SurfaceHolder myHolder; //myHolder勇于展现surfaceView的图像private Camera.PictureCallback myPictureCallBacknew Camera.PictureCallback() {Overridepublic void onPictureTaken(byte[] data, Camera arg1) {//将拍照得到的数据信息存储到本地File tempFilenew File(/sdcard/temp.png);try {FileOutputStream fosnew FileOutputStream(tempFile);fos.write(data);fos.close();//然后将这个照片的数据信息传送给要进行展示的Activity即可Intent intentnew Intent(CustomCarema.this,ResultActivity.class);intent.putExtra(PicturePath, tempFile.getAbsolutePath());startActivity(intent);//拍照结束之后销毁当前的Activity进入到图片展示界面CustomCarema.this.finish();} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}};Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.customcarema);preview(SurfaceView) findViewById(R.id.preview);myHolderpreview.getHolder();myHolder.addCallback(this);//实现点击屏幕自动聚焦的功能此处并不需要拍照故只是聚焦preview.setOnClickListener(new OnClickListener() {Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubmyCamera.autoFocus(null);}});}Overrideprotected void onResume() {super.onResume();if(myCameranull){myCameragetCamera();if(myHolder ! null ){setStartPreview(myCamera, myHolder);}}}Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();releaseCamera();}/*** 释放相机的资源*/private void releaseCamera(){if(myCamera !null ){myCamera.setPreviewCallback(null);myCamera.stopPreview();myCamera.release();myCameranull;}}/*** 拍照的一些参数设置,点击此按钮之后会触发拍照的会掉进而实现拍照的效果* param view*/public void onCapture(View view){Camera.Parameters parametersmyCamera.getParameters();//设置照片的类型parameters.setPictureFormat(ImageFormat.JPEG);parameters.setPictureSize(800, 600);//设置为自动聚焦parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置为自动聚焦是不够的因为我们先得到的是最为清晰的图片所以要在聚焦成功的时候才进行拍照myCamera.autoFocus(new Camera.AutoFocusCallback() {Overridepublic void onAutoFocus(boolean success, Camera camera) {// TODO Auto-generated method stubif(success){myCamera.takePicture(null, null, myPictureCallBack);}}});}/*** 获取系统的一个Camera对象*/private Camera getCamera(){Camera cameranull;try{cameraCamera.open();}catch(Exception e){e.printStackTrace();}return camera;}/*** 开始预览相机的内容其实就是讲surfaceHolder与之绑定*/private void setStartPreview(Camera camera,SurfaceHolder holder){//直接调用系统方式绑定预览try {camera.setPreviewDisplay(holder);//由于系统默认使用横屏预览所以要进行设置camera.setDisplayOrientation(90);camera.startPreview();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Overridepublic void surfaceChanged(SurfaceHolder holder, int arg1, int arg2, int arg3) {// TODO Auto-generated method stubmyCamera.stopPreview();setStartPreview(myCamera, myHolder);}Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubsetStartPreview(myCamera, myHolder);}Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {// TODO Auto-generated method stubreleaseCamera();}}然后是结果界面代码package com.example.camerademo;import java.io.FileInputStream;import java.io.FileNotFoundException;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.os.Bundle;import android.widget.ImageView;public class ResultActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.resultactivity);String pathgetIntent().getStringExtra(PicturePath);ImageView imageview(ImageView) findViewById(R.id.picture);//由于这样稚嫩获得横屏所以我们要使用流的形式来转换// Bitmap bitmapBitmapFactory.decodeFile(path);// imageview.setImageBitmap(bitmap);FileInputStream fis;try {fis new FileInputStream(path);Bitmap bitmapBitmapFactory.decodeStream(fis);Matrix matrixnew Matrix();matrix.setRotate(90);bitmapBitmap.createBitmap(bitmap, 0,0, bitmap.getWidth(),bitmap.getHeight(),matrix,true);imageview.setImageBitmap(bitmap);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}以上代码中已经做了下关的代码注释总结安卓6.0以上版本记得加动态权限,不然会报空指针哦,还有点击拍照事件那里 别忘了加进去,不然拍照没反应以上就是Android 自定义相机的实例详解如有疑问请留言或者到本站社区交流讨论感谢阅读希望能帮助到大家谢谢大家对本站的支持