Camera基本开发知识
2016-12-03 15:59
190 查看
加权限;如API23及以上,要请求权限
1:调用系统相机
2:调用系统拍照,并把图片存在特定文件夹
拍照结束回调:
3:自定义相机拍照
onResume()中获取相机并绑定surfaceView,开启预览
当点击拍照的时候:
完整代码如下
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" />
1:调用系统相机
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQ_1);
2:调用系统拍照,并把图片存在特定文件夹
private String mFilePath; mFilePath= Environment.getExternalStorageDirectory().getPath(); mFilePath=mFilePath+"/"+"temp.png"; Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //将拍的图片存在这个路径下 Uri photoUri=Uri.fromFile(new File(mFilePath)); intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri); startActivityForResult(intent, REQ_2);
拍照结束回调:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); FileInputStream fis=null; if(resultCode==RESULT_OK){ if(requestCode==REQ_1){ Bundle bundle=data.getExtras(); Bitmap bit= (Bitmap) bundle.get("data"); iv.setImageBitmap(bit); }else if(requestCode==REQ_2){ try { fis=new FileInputStream(mFilePath); Bitmap bitmap= BitmapFactory.decodeStream(fis); iv.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); }finally { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
3:自定义相机拍照
onResume()中获取相机并绑定surfaceView,开启预览
@Override protected void onResume() { super.onResume(); if(mCamera==null){ mCamera=getCamera(); if (mHolder!=null){ setStartPreview(mCamera,mHolder); } } } /** * 获取系统camera对象 * @return */ private Camera getCamera(){ Camera camera=null; try { camera=Camera.open(); }catch (Exception e){ camera=null; e.printStackTrace(); } return camera; } //实时预览相机图像 private void setStartPreview(Camera camera,SurfaceHolder holder){ try { camera.setPreviewDisplay(holder);//将相机与surfaceView控件绑定 camera.setDisplayOrientation(90);//将相机试图旋转90度,因为默认是横屏显示 camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } }
当点击拍照的时候:
//点击事件 public void capture(View view){ Camera.Parameters parameters=mCamera.getParameters();//参数 parameters.setPictureFormat(ImageFormat.JPEG); parameters.setPictureSize(800, 400); parameters.setFlashMode(Camera.Parameters.FOCUS_MODE_AUTO);//自动对焦 mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { camera.takePicture(null, null, pictureCallback); } } }); } //拍照之后回调取数据 private Camera.PictureCallback pictureCallback=new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File file=new File("/sdcard/temp.png"); try { FileOutputStream fos=new FileOutputStream(file); fos.write(data); fos.close(); Intent intent =new Intent(CustomActivity.this,ResultActivity.class); intent.putExtra("picpath",file.getAbsolutePath()); startActivity(intent); CustomActivity.this.finish(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } };
完整代码如下
public class CustomActivity extends AppCompatActivity implements SurfaceHolder.Callback { private SurfaceView mSview; private Camera mCamera; private SurfaceHolder mHolder; private Camera.PictureCallback pictureCallback=new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { File file=new File("/sdcard/temp.png"); try { FileOutputStream fos=new FileOutputStream(file); fos.write(data); fos.close(); Intent intent =new Intent(CustomActivity.this,ResultActivity.class); intent.putExtra("picpath",file.getAbsolutePath()); startActivity(intent); CustomActivity.this.finish(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.custom); initView(); mHolder=mSview.getHolder(); mHolder.addCallback(this); } private void initView() { mSview= (SurfaceView) findViewById(R.id.preView); mSview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mCamera.autoFocus(null);//点击自动对焦 } }); } @Override protected void onResume() { super.onResume(); if(mCamera==null){ mCamera=getCamera(); if (mHolder!=null){ setStartPreview(mCamera,mHolder); } } } @Override protected void onPause() { super.onPause(); releaseCamera(); } //点击事件 public void capture(View view){ Camera.Parameters parameters=mCamera.getParameters();//参数 parameters.setPictureFormat(ImageFormat.JPEG); parameters.setPictureSize(800, 400); parameters.setFlashMode(Camera.Parameters.FOCUS_MODE_AUTO);//自动对焦 mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { camera.takePicture(null, null, pictureCallback); } } }); } /** * 获取系统camera对象 * @return */ private Camera getCamera(){ Camera camera=null; try { camera=Camera.open(); }catch (Exception e){ camera=null; e.printStackTrace(); } return camera; } //实时预览相机图像 private void setStartPreview(Camera camera,SurfaceHolder holder){ try { camera.setPreviewDisplay(holder);//将相机与surfaceView控件绑定 camera.setDisplayOrientation(90);//将相机试图旋转90度,因为默认是横屏显示 camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } //释放相机资源 private void releaseCamera(){ if(mCamera!=null){ mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera=null; } } @Override public void surfaceCreated(SurfaceHolder holder) { setStartPreview(mCamera, mHolder); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { mCamera.stopPreview(); setStartPreview(mCamera, mHolder); } @Override public void surfaceDestroyed(SurfaceHolder holder) { releaseCamera(); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="30"> <SurfaceView android:id="@+id/preView" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="水印" android:textColor="#f6424a" android:textSize="20sp" android:layout_marginBottom="61dp" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" /> </RelativeLayout> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="capture" android:onClick="capture"/> </LinearLayout>
public class ResultActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_result); String path=getIntent().getStringExtra("picpath"); // Bitmap bitmap= BitmapFactory.decodeFile(path); ImageView iv= (ImageView) findViewById(R.id.pic); //iv.setImageBitmap(bitmap); try { FileInputStream fis=new FileInputStream(path); Bitmap bit = BitmapFactory.decodeStream(fis); Matrix mat=new Matrix(); mat.setRotate(90); //把原来当位图旋转90度 bit=Bitmap.createBitmap(bit,0,0,bit.getWidth(),bit.getHeight(),mat,true); iv.setImageBitmap(bit); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
相关文章推荐
- Keil C51开发系统基本知识(2)
- Keil C51开发系统基本知识(3)
- Keil C51开发系统基本知识-3
- Discuz二次开发基本知识总结
- DISCUZ二次开发目录结构基本知识
- java程序员:开发系统要注意的基本知识!
- SharpStreaming项目开发纪实:构建基本的服务器及客户端应用(一)——准备知识(Socket编程)
- Discuz二次开发基本知识
- 关于linux图形界面编程基本知识 - 技术文档 - 程序开发 Linux时代 - 开源、... (转载)
- Keil C51开发系统基本知识(1)
- 第1398篇:Keil C51开发系统基本知识(一)
- 【SD2.0大会】Java培训先驱张孝祥:Java开发中的基本安全知识
- Keil C51开发系统基本知识-2
- 开发Java系统程序员要注意的基本知识
- 关于.net开发常见基本知识总结(每日更新)
- java程序员:开发系统要注意的基本知识
- POI实战-java开发excel详解(第一章 基本知识)
- 1.1 游戏开发中的调度器基本知识
- SharpStreaming项目开发纪实:构建基本的服务器及客户端应用(三)——准备知识(多线程编程)
- 『phphot』【SD2.0大会】Java培训先驱张孝祥:Java开发中的基本安全知识