Camera2拍照(备忘)
来源:互联网 发布:发条js调试工具 2.0 编辑:程序博客网 时间:2024/06/08 17:29
首先上布局代码:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_marginLeft="@dimen/fab_margin" android:layout_marginRight="@dimen/fab_margin" xmlns:app="http://schemas.android.com/apk/res-auto" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:fitsSystemWindows="true"> <TextureView android:id="@+id/tv_textview" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="3" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <ImageView android:id="@+id/iv_Thumbnail" android:layout_width="50dp" android:layout_height="70dp" android:layout_alignParentLeft="true" android:background="@drawable/bg_border" android:visibility="gone" /> <ImageView android:id="@+id/iv_Thumbnail2" android:layout_width="50dp" android:layout_height="70dp" android:layout_toRightOf="@id/iv_Thumbnail" android:layout_alignTop="@id/iv_Thumbnail" android:layout_marginLeft="5dp" android:visibility="gone" /> <ImageView android:id="@+id/iv_Thumbnail3" android:layout_width="50dp" android:layout_height="70dp" android:layout_toRightOf="@id/iv_Thumbnail2" android:layout_alignTop="@id/iv_Thumbnail2" android:layout_marginLeft="5dp" android:visibility="gone" /> <Button android:id="@+id/btn_takepic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="拍照" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/finishAndback" android:layout_below="@id/btn_takepic" android:layout_alignParentRight="true" /> </RelativeLayout></LinearLayout>
Activity代码
import android.Manifest;import android.content.Context;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.ImageFormat;import android.graphics.SurfaceTexture;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.hardware.camera2.CameraAccessException;import android.hardware.camera2.CameraCaptureSession;import android.hardware.camera2.CameraCharacteristics;import android.hardware.camera2.CameraDevice;import android.hardware.camera2.CameraManager;import android.hardware.camera2.CaptureRequest;import android.hardware.camera2.CaptureResult;import android.hardware.camera2.TotalCaptureResult;import android.hardware.camera2.params.StreamConfigurationMap;import android.media.AudioAttributes;import android.media.Image;import android.media.ImageReader;import android.media.Ringtone;import android.media.RingtoneManager;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.support.v4.app.ActivityCompat;import android.util.Log;import android.util.Size;import android.util.SparseIntArray;import android.view.Surface;import android.view.TextureView;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import java.nio.ByteBuffer;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;import cn.com.zifar.Utility.ConstHelper;import static cn.com.zifar.mobileforpatrol.R.id.iv_Thumbnail;public class MyCameraActivity extends MyBaseActivity{ TextureView mTextureView; ImageView mThumbnail; Button mButton; Handler mHandler,childHandler; ImageReader mImageReader; CaptureRequest.Builder mPreViewBuidler; CameraCaptureSession mCameraSession; CameraCharacteristics mCameraCharacteristics; Ringtone ringtone; private Size mPreViewSize; private CameraDevice CameraDevice; private CameraManager manager; private String cameraid; private Context context; private List<Bitmap> MypicList; private List<ImageView> MyImgList; private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); ///为了使照片竖直显示 static { ORIENTATIONS.append(Surface.ROTATION_0, 90); ORIENTATIONS.append(Surface.ROTATION_90, 0); ORIENTATIONS.append(Surface.ROTATION_180, 270); ORIENTATIONS.append(Surface.ROTATION_270, 180); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_camera); InitMyActivity(); InitTools(); context=this; MypicList=new ArrayList<>(); FindView(); } /** * 显示图片 */ private void ShowImg(){ runOnUiThread(new Runnable() { @Override public void run() { if((MypicList!=null &&MypicList.size()>0) && (MyImgList!=null && MyImgList.size()>0)) for(int i=0;i<MyImgList.size();i++){ android.widget.ImageView img=MyImgList.get(i); if(i>=MypicList.size()){ img.setVisibility(View.GONE); break; } Bitmap bitmap=MypicList.get(i); if(bitmap!=null){ img.setImageBitmap(bitmap); img.setVisibility(View.VISIBLE); } } } }); } /** * 删除图片 * @param imageView */ private void DelImg(ImageView imageView){ int id=imageView.getId(); int index=0; switch(id){ case R.id.iv_Thumbnail: index=0; break; case R.id.iv_Thumbnail2: index=1; break; case R.id.iv_Thumbnail3: index=2; break; } Drawable drawable = imageView.getDrawable(); if (drawable != null && drawable instanceof BitmapDrawable){ BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; Bitmap bitmap = bitmapDrawable.getBitmap(); if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); } MypicList.set(index,null); } ClearNullBitmap(); //imageView.setWillNotDraw(true); ShowImg(); } private void ClearNullBitmap(){ List<Bitmap> nlist=new ArrayList<>(); if(MypicList!=null){ for(Bitmap bitmap:MypicList){ if(bitmap==null)continue; nlist.add(bitmap); } } MypicList=nlist; } private final class ImageViewClickListener implements ImageView.OnLongClickListener{ @Override public boolean onLongClick(View v) { DelImg((ImageView) v); return true; } } private void FindView(){ mTextureView = (TextureView) findViewById(R.id.tv_textview); mButton = (Button) findViewById(R.id.btn_takepic); MyImgList=new ArrayList<>(); ImageView mThumbnail = (ImageView) findViewById(iv_Thumbnail); mThumbnail.setOnLongClickListener(new ImageViewClickListener()); MyImgList.add(mThumbnail); ImageView iv_Thumbnail2=(ImageView)findViewById(R.id.iv_Thumbnail2); iv_Thumbnail2.setOnLongClickListener(new ImageViewClickListener()); MyImgList.add(iv_Thumbnail2); ImageView iv_Thumbnail3=(ImageView)findViewById(R.id.iv_Thumbnail3); iv_Thumbnail3.setOnLongClickListener(new ImageViewClickListener()); MyImgList.add(iv_Thumbnail3); ShowImg(); //初始化相机布局 mTextureView.setSurfaceTextureListener(mSurfacetextlistener); //初始化拍照的声音 ringtone = RingtoneManager.getRingtone(MyCameraActivity.this, Uri.parse("file:///system/media/audio/ui/camera_click.ogg")); AudioAttributes.Builder attr = new AudioAttributes.Builder(); attr.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION); ringtone.setAudioAttributes(attr.build()); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(MypicList.size()>=3){ Toast.makeText(context,R.string.morethanmax,Toast.LENGTH_SHORT).show(); return; } shootSound(); try { if(CameraDevice==null)return; final CaptureRequest.Builder captureRequestBuilder; captureRequestBuilder = CameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); // 将imageReader的surface作为CaptureRequest.Builder的目标 captureRequestBuilder.addTarget(mImageReader.getSurface()); // 自动对焦 captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE); // 自动曝光 captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); // 获取手机方向 int rotation = getWindowManager().getDefaultDisplay().getRotation(); // 根据设备方向计算设置照片的方向 captureRequestBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation)); //拍照 CaptureRequest mCaptureRequest = captureRequestBuilder.build(); mCameraSession.capture(mCaptureRequest, null, childHandler); } catch (Exception e) { e.printStackTrace(); } } }); } @Override protected void onDestroy() { if(CameraDevice!=null){ CameraDevice.close(); CameraDevice=null; } super.onDestroy(); } /** * 播放系统的拍照的声音 */ public void shootSound() { ringtone.stop(); ringtone.play(); } //打开相机时候的监听器,通过他可以得到相机实例,这个实例可以创建请求建造者 private CameraDevice.StateCallback cameraOpenCallBack = new CameraDevice.StateCallback() { @Override public void onOpened(CameraDevice cameraDevice) { CameraDevice=cameraDevice; Log.d(ConstHelper.TagName, "相机已经打开"); try { mPreViewBuidler = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); SurfaceTexture texture = mTextureView.getSurfaceTexture(); texture.setDefaultBufferSize(mPreViewSize.getWidth(), mPreViewSize.getHeight()); Surface surface = new Surface(texture); mPreViewBuidler.addTarget(surface); cameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), mSessionStateCallBack, childHandler); } catch (Exception e) { e.printStackTrace(); } } @Override public void onDisconnected(CameraDevice cameraDevice) { Log.d(ConstHelper.TagName, "相机连接断开"); } @Override public void onError(CameraDevice cameraDevice, int i) { Log.d(ConstHelper.TagName, "相机打开失败"); } }; //相机会话的监听器,通过他得到mCameraSession对象,这个对象可以用来发送预览和拍照请求 private CameraCaptureSession.StateCallback mSessionStateCallBack = new CameraCaptureSession.StateCallback() { @Override public void onConfigured(CameraCaptureSession cameraCaptureSession) { try { mCameraSession = cameraCaptureSession; mCameraSession.setRepeatingRequest(mPreViewBuidler.build(), mCaptureCallBack, childHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) { } }; private CameraCaptureSession.CaptureCallback mCaptureCallBack=new CameraCaptureSession.CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { super.onCaptureCompleted(session, request, result); } @Override public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request, CaptureResult partialResult) { super.onCaptureProgressed(session, request, partialResult); } }; private TextureView.SurfaceTextureListener mSurfacetextlistener=new TextureView.SurfaceTextureListener(){ @Override public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) { HandlerThread thread = new HandlerThread("Ceamera3"); thread.start(); mHandler = new Handler(getMainLooper()); childHandler=new Handler(thread.getLooper()); manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); cameraid = CameraCharacteristics.LENS_FACING_FRONT + ""; try { mCameraCharacteristics = manager.getCameraCharacteristics(cameraid); StreamConfigurationMap map = mCameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); Size largest = Collections.max(Arrays.asList(map.getOutputSizes(ImageFormat.JPEG)), new CompareSizeByArea()); mPreViewSize = map.getOutputSizes(SurfaceTexture.class)[0]; mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, 5); mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(final ImageReader reader) { try{ Image image = reader.acquireNextImage(); ByteBuffer buffer = image.getPlanes()[0].getBuffer(); byte[] bytes = new byte[buffer.remaining()]; buffer.get(bytes);//由缓冲区存入字节数组 Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); if(bitmap!=null) { MypicList.add(bitmap); ShowImg(); } image.close(); }catch (Exception ex){ ex.printStackTrace(); } } }, mHandler); if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MyCameraActivity.this,new String[]{Manifest.permission.CAMERA},PackageManager.PERMISSION_GRANTED); } manager.openCamera(cameraid, cameraOpenCallBack, mHandler); } catch (CameraAccessException e) { e.printStackTrace(); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { if(CameraDevice!=null){ CameraDevice.close(); CameraDevice=null; } return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { } };}
0 0
- Camera2拍照(备忘)
- android camera2 拍照流程
- 摄像头拍照功能5.0 Camera2
- Camera2.0 控制摄像头拍照
- Android Camera2 拍照入门学习
- Android Camera2 拍照入门学习
- Android Camera2 拍照入门学习
- Android开发 之 Camera2之拍照
- camera2
- camera2
- Android Camera2拍照(一)——使用SurfaceView
- Android Camera2 拍照(二)——使用TextureView
- Android Camera2 拍照(四)——对焦模式
- Android5.1.1 自带Camera2/SnapdragonCamera的apk拍照方向旋转90°
- Android Camera2教程之打开相机、开启预览、实现PreviewCallback、拍照
- 【笔记】Android5.0前后的Camera和Camera2 预览、拍照、摄像头切换
- Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
- Android开发之一个类实现Camera2预览和拍照效果
- 第一个maven项目
- 安卓过渡动画入门介绍
- 时间序列(三)
- 第5章 依赖倒转原则
- 命令模式(Command)
- Camera2拍照(备忘)
- Caffe学习系列(12):训练和测试自己的图片
- nginx 服务器重启关闭命令
- .NET NPOI导出Excel详解
- Coursera上的Andrew Ng《机器学习》学习笔记Week1
- 关于10grac 11grac 修改hostname的问题
- [杂项]测试
- 【WPF】C#用POST请求参数含中文,服务器解析得到乱码问题
- Python初学,web.py的Hello World