Android照相的方式:调用系统相机、自定义 Camera

打印 上一主题 下一主题

主题 838|帖子 838|积分 2524

一、调用系统相机:



  • 清单文件配置
  • 授权、打开相机
  • 获取照片
  • 注意事项
1、清单文件配置

A、配置利用相机权限
  1.     <uses-feature
  2.         android:name="android.hardware.camera"
  3.         android:required="false" />
  4.     <uses-permission android:name="android.permission.CAMERA" />
复制代码
B、provider配置
  1. <provider
  2.             android:authorities="com.example.camera.fileprovider"
  3.             android:name="androidx.core.content.FileProvider"
  4.             android:exported="false"
  5.         android:grantUriPermissions="true">
  6.         <meta-data
  7.             android:name="android.support.FILE_PROVIDER_PATHS"
  8.             android:resource="@xml/c"/>
复制代码
C、meta-data标签:resource配置文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <paths>
  3.     <external-path
  4.         name="my_images"
  5.         path="."/>
  6. </paths>
复制代码
2、授权打开系统相机:
A、打开页面授权:通过重写onRequestPermissionsResult方法获取授权结果。
  1.   if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA) !=
  2.                 PackageManager.PERMISSION_GRANTED
  3.             ) {
  4.                 ActivityCompat.requestPermissions(
  5.                     requireActivity(),
  6.                     arrayOf(Manifest.permission.CAMERA),
  7.                     100
  8.                 )
  9.             } else {
  10.                 openCamera()
  11.             }
复制代码
B、打开系统相机:下图中的imageUri是一个全局变量,是照相乐成后的图片 uri,照相乐成后在
  1. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
复制代码
方法中进行处理。
  1.     fun openCamera() {
  2.         val intent = Intent()
  3.         // 指定开启系统相机的Action
  4.         intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE)
  5.         intent.addCategory(Intent.CATEGORY_DEFAULT)
  6.         // 根据文件地址创建文件
  7.         val file: File? = createImageFile()
  8.         if (file?.exists() == true) {
  9.             file?.delete()
  10.         }
  11.         // 把文件地址转换成Uri格式
  12.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  13.             /*7.0以上要通过FileProvider将File转化为Uri*/
  14.             imageUri = file?.let {
  15.                 FileProvider.getUriForFile(
  16.                     requireContext(), "com.example.camera.fileprovider",
  17.                     it
  18.                 )
  19.             };
  20.         } else {
  21.             /*7.0以下则直接使用Uri的fromFile方法将File转化为Uri*/
  22.             imageUri = Uri.fromFile(file);
  23.         }
  24.         // 设置系统相机拍摄照片完成后图片文件的存放地址
  25.         // 设置系统相机拍摄照片完成后图片文件的存放地址
  26.         intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
  27.         startActivityForResult(intent, 100)
  28.     }
复制代码
注意:startActivityForResult() 是如果着实 Fragment中就不要利用 activity启动。
  
二、调用系统相机:



  • 清单文件配置
  • Camera自定义视图、工具
  • 利用
1、清单文件中只必要添加相应权限

  1. <uses-feature
  2.     android:name="android.hardware.camera"
  3.     android:required="false" />
  4. <uses-permission android:name="android.permission.CAMERA" />
复制代码
2、自定义SurfaceView相机预览

  1. class CameraSurfaceView  extends SurfaceView implements SurfaceHolder.Callback {
  2.     private static final String TAG = CameraSurfaceView.class.getSimpleName();
  3.     private SurfaceHolder mSurfaceHolder;
  4.     public CameraSurfaceView(Context context) {
  5.         super(context);
  6.         init();
  7.     }
  8.     public CameraSurfaceView(Context context, AttributeSet attrs) {
  9.         super(context, attrs);
  10.         init();
  11.     }
  12.     public CameraSurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
  13.         super(context, attrs, defStyleAttr);
  14.         init();
  15.     }
  16.     private void init() {
  17.         mSurfaceHolder = getHolder();
  18.         mSurfaceHolder.addCallback(this);
  19.     }
  20.     @Override
  21.     public void surfaceCreated(SurfaceHolder holder) {
  22.         CameraUtils.openFrontalCamera(CameraUtils.DESIRED_PREVIEW_FPS);
  23.     }
  24.     @Override
  25.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  26.         CameraUtils.startPreviewDisplay(holder);
  27.     }
  28.     @Override
  29.     public void surfaceDestroyed(SurfaceHolder holder) {
  30.         CameraUtils.releaseCamera();
  31.     }
  32. }
复制代码
3、Camera工具,用来控制相机、获取照片

  1. public class CameraUtils {
  2.     // 相机默认宽高,相机的宽度和高度跟屏幕坐标不一样,手机屏幕的宽度和高度是反过来的。
  3.     public static final int DEFAULT_WIDTH = 1280;
  4.     public static final int DEFAULT_HEIGHT = 720;
  5.     public static final int DESIRED_PREVIEW_FPS = 270;
  6.     private static int mCameraID = Camera.CameraInfo.CAMERA_FACING_FRONT;
  7.     private static Camera mCamera;
  8.     private static int mCameraPreviewFps;
  9.     private static int mOrientation = 0;
  10.     /**
  11.      * 打开相机,默认打开后置相机
  12.      * @param expectFps
  13.      */
  14.     public static void openFrontalCamera(int expectFps) {
  15.         if (mCamera != null) {
  16.             throw new RuntimeException("camera already initialized!");
  17.         }
  18.         Camera.CameraInfo info = new Camera.CameraInfo();
  19.         int numCameras = Camera.getNumberOfCameras();
  20. //        for (int i = 0; i < numCameras; i++) {
  21. //            Camera.getCameraInfo(i, info);
  22. //            if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
  23. //                mCamera = Camera.open(0);
  24. //                mCameraID = info.facing;
  25. //                break;
  26. //            }
  27. //        }
  28.         // 如果没有前置摄像头,则打开默认的后置摄像头
  29.         if (mCamera == null) {
  30.             mCamera = Camera.open();
  31.             mCameraID = Camera.CameraInfo.CAMERA_FACING_BACK;
  32.    
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

来自云龙湖轮廓分明的月亮

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表