Camera基本开发知识

    xiaoxiao2021-12-14  14

    加权限;如API23及以上,要请求权限

    <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(); } } }
    转载请注明原文地址: https://ju.6miu.com/read-969433.html

    最新回复(0)