From 99e4b46bb1eb6d89eac762225a422bd416974921 Mon Sep 17 00:00:00 2001 From: wildma Date: Sun, 30 Dec 2018 22:47:09 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E9=80=82=E9=85=8D=E5=85=A8=E9=9D=A2?= =?UTF-8?q?=E5=B1=8F=20=202.=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- app/build.gradle | 16 +- app/src/main/AndroidManifest.xml | 4 +- build.gradle | 5 +- gradle/wrapper/gradle-wrapper.properties | 2 +- idcardcamera/build.gradle | 15 +- .../idcardcamera/camera/CameraActivity.java | 117 ++++++++------- .../idcardcamera/camera/CameraPreview.java | 86 ++++++----- .../idcardcamera/camera/CameraUtils.java | 13 +- .../wildma/idcardcamera/utils/ImageUtils.java | 24 +++ .../idcardcamera/utils/ScreenUtils.java | 33 +++++ .../main/res/layout-land/activity_camera.xml | 140 ------------------ .../src/main/res/layout/activity_camera.xml | 1 + 13 files changed, 210 insertions(+), 248 deletions(-) create mode 100644 idcardcamera/src/main/java/com/wildma/idcardcamera/utils/ScreenUtils.java delete mode 100644 idcardcamera/src/main/res/layout-land/activity_camera.xml diff --git a/README.md b/README.md index 4113a8f..079592e 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ allprojects { 在需要使用的module中添加依赖 ``` dependencies { - compile 'com.github.wildma:IDCardCamera:1.0.1' + compile 'com.github.wildma:IDCardCamera:1.0.2' } ``` 或者引用本地lib diff --git a/app/build.gradle b/app/build.gradle index d80d493..621c277 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,10 +2,9 @@ apply plugin: 'com.android.application' android { compileSdkVersion 26 - buildToolsVersion "26.0.0" defaultConfig { applicationId "com.wildma.wildmaidcardcamera" - minSdkVersion 15 + minSdkVersion 14 targetSdkVersion 26 versionCode 1 versionName "1.0" @@ -17,14 +16,17 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + lintOptions { + disable 'GoogleAppIndexingWarning'//禁止 AS 出现 App is not indexable by Google Search 警告 + } } dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + implementation fileTree(include: ['*.jar'], dir: 'libs') + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:26.+' - testCompile 'junit:junit:4.12' - compile project(':idcardcamera') + implementation 'com.android.support:appcompat-v7:26.+' + testImplementation 'junit:junit:4.12' + implementation project(':idcardcamera') } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 084324b..f25a1a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,7 +8,9 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> - + diff --git a/build.gradle b/build.gradle index c20bca1..e60d05d 100644 --- a/build.gradle +++ b/build.gradle @@ -3,10 +3,10 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' - + classpath 'com.android.tools.build:gradle:3.2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } @@ -15,6 +15,7 @@ buildscript { allprojects { repositories { jcenter() + google() } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 04e285f..6725cf5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip \ No newline at end of file diff --git a/idcardcamera/build.gradle b/idcardcamera/build.gradle index 12a1742..b21d21e 100644 --- a/idcardcamera/build.gradle +++ b/idcardcamera/build.gradle @@ -2,13 +2,12 @@ apply plugin: 'com.android.library' android { compileSdkVersion 26 - buildToolsVersion "26.0.0" defaultConfig { - minSdkVersion 15 + minSdkVersion 14 targetSdkVersion 26 - versionCode 101 - versionName "1.0.1" + versionCode 102 + versionName "1.0.2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -22,10 +21,10 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + implementation fileTree(dir: 'libs', include: ['*.jar']) + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:26.+' - testCompile 'junit:junit:4.12' + implementation 'com.android.support:appcompat-v7:26.+' + testImplementation 'junit:junit:4.12' } diff --git a/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraActivity.java b/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraActivity.java index 8ca8790..dd6ed59 100644 --- a/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraActivity.java +++ b/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraActivity.java @@ -6,7 +6,6 @@ import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.hardware.Camera; import android.os.Bundle; import android.os.Handler; @@ -14,9 +13,9 @@ import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; @@ -27,6 +26,7 @@ import com.wildma.idcardcamera.utils.FileUtils; import com.wildma.idcardcamera.utils.ImageUtils; import com.wildma.idcardcamera.utils.PermissionUtils; +import com.wildma.idcardcamera.utils.ScreenUtils; /** @@ -37,16 +37,15 @@ */ public class CameraActivity extends Activity implements View.OnClickListener { - public final static int TYPE_IDCARD_FRONT = 1;//身份证正面 - public final static int TYPE_IDCARD_BACK = 2;//身份证反面 - public final static int REQUEST_CODE = 0X11;//请求码 - public final static int RESULT_CODE = 0X12;//结果码 - public final static int PERMISSION_CODE_FIRST = 0x13;//权限请求码 - public final static String TAKE_TYPE = "take_type";//拍摄类型标记 - public final static String IMAGE_PATH = "image_path";//图片路径标记 - public static int mType;//拍摄类型 - public static Activity mActivity; - private boolean isToast = true;//是否弹吐司,为了保证for循环只弹一次 + public final static int TYPE_IDCARD_FRONT = 1;//身份证正面 + public final static int TYPE_IDCARD_BACK = 2;//身份证反面 + public final static int REQUEST_CODE = 0X11;//请求码 + public final static int RESULT_CODE = 0X12;//结果码 + private final int PERMISSION_CODE_FIRST = 0x13;//权限请求码 + private final static String TAKE_TYPE = "take_type";//拍摄类型标记 + private final static String IMAGE_PATH = "image_path";//图片路径标记 + private int mType;//拍摄类型 + private boolean isToast = true;//是否弹吐司,为了保证for循环只弹一次 private CropImageView mCropImageView; private Bitmap mCropBitmap; @@ -57,6 +56,8 @@ public class CameraActivity extends Activity implements View.OnClickListener { private View mLlCameraOption; private View mLlCameraResult; private TextView mViewCameraCropBottom; + private FrameLayout mFlCameraOption; + private View mViewCameraCropLeft; /** * 跳转到拍照界面 @@ -145,21 +146,22 @@ private void initView() { mLlCameraResult = findViewById(R.id.ll_camera_result); mCropImageView = findViewById(R.id.crop_image_view); mViewCameraCropBottom = (TextView) findViewById(R.id.view_camera_crop_bottom); + mFlCameraOption = (FrameLayout) findViewById(R.id.fl_camera_option); + mViewCameraCropLeft = findViewById(R.id.view_camera_crop_left); - //获取屏幕最小边,设置为cameraPreview较窄的一边 - float screenMinSize = Math.min(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels); - //根据screenMinSize,计算出cameraPreview的较宽的一边,长宽比为标准的16:9 - float maxSize = screenMinSize / 9.0f * 16.0f; - RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams((int) maxSize, (int) screenMinSize); - layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); - mCameraPreview.setLayoutParams(layoutParams); - + float screenMinSize = Math.min(ScreenUtils.getScreenWidth(this), ScreenUtils.getScreenHeight(this)); + float screenMaxSize = Math.max(ScreenUtils.getScreenWidth(this), ScreenUtils.getScreenHeight(this)); float height = (int) (screenMinSize * 0.75); float width = (int) (height * 75.0f / 47.0f); + //获取底部"操作区域"的宽度 + float flCameraOptionWidth = (screenMaxSize - width) / 2; LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams((int) width, ViewGroup.LayoutParams.MATCH_PARENT); LinearLayout.LayoutParams cropParams = new LinearLayout.LayoutParams((int) width, (int) height); + LinearLayout.LayoutParams cameraOptionParams = new LinearLayout.LayoutParams((int) flCameraOptionWidth, ViewGroup.LayoutParams.MATCH_PARENT); mLlCameraCropContainer.setLayoutParams(containerParams); mIvCameraCrop.setLayoutParams(cropParams); + //获取"相机裁剪区域"的宽度来动态设置底部"操作区域"的宽度,使"相机裁剪区域"居中 + mFlCameraOption.setLayoutParams(cameraOptionParams); switch (mType) { case TYPE_IDCARD_FRONT: @@ -220,46 +222,59 @@ public void onClick(View v) { */ private void takePhoto() { mCameraPreview.setEnabled(false); - mCameraPreview.takePhoto(new Camera.PictureCallback() { + CameraUtils.getCamera().setOneShotPreviewCallback(new Camera.PreviewCallback() { @Override - public void onPictureTaken(final byte[] data, Camera camera) { + public void onPreviewFrame(final byte[] bytes, Camera camera) { + final Camera.Size size = camera.getParameters().getPreviewSize(); //获取预览大小 camera.stopPreview(); - //子线程处理图片,防止ANR new Thread(new Runnable() { @Override public void run() { - Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); - - /*计算裁剪位置*/ - float left, top, right, bottom; - left = ((float) mLlCameraCropContainer.getLeft() - (float) mCameraPreview.getLeft()) / (float) mCameraPreview.getWidth(); - top = (float) mIvCameraCrop.getTop() / (float) mCameraPreview.getHeight(); - right = (float) mLlCameraCropContainer.getRight() / (float) mCameraPreview.getWidth(); - bottom = (float) mIvCameraCrop.getBottom() / (float) mCameraPreview.getHeight(); - - /*自动裁剪*/ - mCropBitmap = Bitmap.createBitmap(bitmap, - (int) (left * (float) bitmap.getWidth()), - (int) (top * (float) bitmap.getHeight()), - (int) ((right - left) * (float) bitmap.getWidth()), - (int) ((bottom - top) * (float) bitmap.getHeight())); - - /*手动裁剪*/ - runOnUiThread(new Runnable() { - @Override - public void run() { - //将裁剪区域设置成与扫描框一样大 - mCropImageView.setLayoutParams(new LinearLayout.LayoutParams(mIvCameraCrop.getWidth(), mIvCameraCrop.getHeight())); - setCropLayout(); - mCropImageView.setImageBitmap(mCropBitmap); - } - }); + final int w = size.width; + final int h = size.height; + Bitmap bitmap = ImageUtils.getBitmapFromByte(bytes, w, h); + cropImage(bitmap); } }).start(); } }); } + /** + * 裁剪图片 + */ + private void cropImage(Bitmap bitmap) { + /*计算扫描框的坐标点*/ + float left = mViewCameraCropLeft.getWidth(); + float top = mIvCameraCrop.getTop(); + float right = mIvCameraCrop.getRight() + left; + float bottom = mIvCameraCrop.getBottom(); + + /*计算扫描框坐标点占原图坐标点的比例*/ + float leftProportion = left / mCameraPreview.getWidth(); + float topProportion = top / mCameraPreview.getHeight(); + float rightProportion = right / mCameraPreview.getWidth(); + float bottomProportion = bottom / mCameraPreview.getBottom(); + + /*自动裁剪*/ + mCropBitmap = Bitmap.createBitmap(bitmap, + (int) (leftProportion * (float) bitmap.getWidth()), + (int) (topProportion * (float) bitmap.getHeight()), + (int) ((rightProportion - leftProportion) * (float) bitmap.getWidth()), + (int) ((bottomProportion - topProportion) * (float) bitmap.getHeight())); + + /*设置成手动裁剪模式*/ + runOnUiThread(new Runnable() { + @Override + public void run() { + //将手动裁剪区域设置成与扫描框一样大 + mCropImageView.setLayoutParams(new LinearLayout.LayoutParams(mIvCameraCrop.getWidth(), mIvCameraCrop.getHeight())); + setCropLayout(); + mCropImageView.setImageBitmap(mCropBitmap); + } + }); + } + /** * 设置裁剪布局 */ @@ -290,11 +305,11 @@ private void setTakePhotoLayout() { * 点击确认,返回图片路径 */ private void confirm() { - /*裁剪图片*/ + /*手动裁剪图片*/ mCropImageView.crop(new CropListener() { @Override public void onFinish(Bitmap bitmap) { - if(bitmap == null) { + if (bitmap == null) { Toast.makeText(getApplicationContext(), getString(R.string.crop_fail), Toast.LENGTH_SHORT).show(); finish(); } diff --git a/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraPreview.java b/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraPreview.java index e61a83b..d40e977 100644 --- a/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraPreview.java +++ b/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraPreview.java @@ -10,6 +10,8 @@ import android.view.SurfaceHolder; import android.view.SurfaceView; +import com.wildma.idcardcamera.utils.ScreenUtils; + import java.util.List; /** @@ -25,6 +27,7 @@ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback private Camera camera; private AutoFocusManager mAutoFocusManager; private SensorControler mSensorControler; + private Context mContext; public CameraPreview(Context context) { super(context); @@ -48,6 +51,7 @@ public CameraPreview(Context context, AttributeSet attrs, int defStyleAttr, int } private void init(Context context) { + mContext = context; SurfaceHolder surfaceHolder = getHolder(); surfaceHolder.addCallback(this); surfaceHolder.setKeepScreenOn(true); @@ -76,19 +80,13 @@ public void surfaceCreated(SurfaceHolder holder) { camera.setDisplayOrientation(0); parameters.setRotation(0); } - Camera.Size bestSize = getBestSize(parameters.getSupportedPreviewSizes()); - if (bestSize != null) { - parameters.setPreviewSize(bestSize.width, bestSize.height); - parameters.setPictureSize(bestSize.width, bestSize.height); - } else { - parameters.setPreviewSize(1920, 1080); - parameters.setPictureSize(1920, 1080); - } + List sizeList = parameters.getSupportedPreviewSizes();//获取所有支持的预览大小 + Camera.Size bestSize = getOptimalPreviewSize(sizeList, ScreenUtils.getScreenWidth(mContext), ScreenUtils.getScreenHeight(mContext)); + parameters.setPreviewSize(bestSize.width, bestSize.height);//设置预览大小 camera.setParameters(parameters); camera.startPreview(); focus();//首次对焦 - //定时对焦 - //mAutoFocusManager = new AutoFocusManager(camera); + //mAutoFocusManager = new AutoFocusManager(camera);//定时对焦 } catch (Exception e) { Log.d(TAG, "Error setting camera preview: " + e.getMessage()); try { @@ -104,8 +102,7 @@ public void surfaceCreated(SurfaceHolder holder) { camera.setParameters(parameters); camera.startPreview(); focus();//首次对焦 - //定时对焦 - //mAutoFocusManager = new AutoFocusManager(camera); + //mAutoFocusManager = new AutoFocusManager(camera);//定时对焦 } catch (Exception e1) { e.printStackTrace(); camera = null; @@ -114,35 +111,56 @@ public void surfaceCreated(SurfaceHolder holder) { } } - public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { - //因为设置了固定屏幕方向,所以在实际使用中不会触发这个方法 - } - - public void surfaceDestroyed(SurfaceHolder holder) { - //回收释放资源 - release(); - } - /** - * Android相机的预览尺寸都是4:3或者16:9,这里遍历所有支持的预览尺寸,得到16:9的最大尺寸,保证成像清晰度 + * 获取最佳预览大小 * - * @param sizes - * @return 最佳尺寸 + * @param sizes 所有支持的预览大小 + * @param w SurfaceView宽 + * @param h SurfaceView高 + * @return */ - private Camera.Size getBestSize(List sizes) { - Camera.Size bestSize = null; + private Camera.Size getOptimalPreviewSize(List sizes, int w, int h) { + final double ASPECT_TOLERANCE = 0.1; + double targetRatio = (double) w / h; + if (sizes == null) + return null; + + Camera.Size optimalSize = null; + double minDiff = Double.MAX_VALUE; + + int targetHeight = h; + + // Try to find an size match aspect ratio and size for (Camera.Size size : sizes) { - if ((float) size.width / (float) size.height == 16.0f / 9.0f) { - if (bestSize == null) { - bestSize = size; - } else { - if (size.width > bestSize.width) { - bestSize = size; - } + double ratio = (double) size.width / size.height; + if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) + continue; + if (Math.abs(size.height - targetHeight) < minDiff) { + optimalSize = size; + minDiff = Math.abs(size.height - targetHeight); + } + } + + // Cannot find the one match the aspect ratio, ignore the requirement + if (optimalSize == null) { + minDiff = Double.MAX_VALUE; + for (Camera.Size size : sizes) { + if (Math.abs(size.height - targetHeight) < minDiff) { + optimalSize = size; + minDiff = Math.abs(size.height - targetHeight); } } } - return bestSize; + return optimalSize; + } + + public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { + //因为设置了固定屏幕方向,所以在实际使用中不会触发这个方法 + } + + public void surfaceDestroyed(SurfaceHolder holder) { + //回收释放资源 + release(); } /** diff --git a/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraUtils.java b/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraUtils.java index 37d39c6..661c7d0 100644 --- a/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraUtils.java +++ b/idcardcamera/src/main/java/com/wildma/idcardcamera/camera/CameraUtils.java @@ -11,6 +11,9 @@ * Desc ${相机工具类} */ public class CameraUtils { + + private static Camera camera; + /** * 检查是否有相机 * @@ -33,12 +36,16 @@ public static boolean hasCamera(Context context) { * @return */ public static Camera openCamera() { - Camera c = null; + camera = null; try { - c = Camera.open(); // attempt to get a Camera instance + camera = Camera.open(); // attempt to get a Camera instance } catch (Exception e) { // Camera is not available (in use or does not exist) } - return c; // returns null if camera is unavailable + return camera; // returns null if camera is unavailable + } + + public static Camera getCamera() { + return camera; } } diff --git a/idcardcamera/src/main/java/com/wildma/idcardcamera/utils/ImageUtils.java b/idcardcamera/src/main/java/com/wildma/idcardcamera/utils/ImageUtils.java index 1c2d0e9..f36b451 100644 --- a/idcardcamera/src/main/java/com/wildma/idcardcamera/utils/ImageUtils.java +++ b/idcardcamera/src/main/java/com/wildma/idcardcamera/utils/ImageUtils.java @@ -2,8 +2,13 @@ import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; +import android.graphics.BitmapFactory; +import android.graphics.ImageFormat; +import android.graphics.Rect; +import android.graphics.YuvImage; import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -94,4 +99,23 @@ public static boolean save(Bitmap src, File file, CompressFormat format, boolean private static boolean isEmptyBitmap(Bitmap src) { return src == null || src.getWidth() == 0 || src.getHeight() == 0; } + + /** + * 将byte[]转换成Bitmap + * + * @param bytes + * @param width + * @param height + * @return + */ + public static Bitmap getBitmapFromByte(byte[] bytes, int width, int height) { + final YuvImage image = new YuvImage(bytes, ImageFormat.NV21, width, height, null); + ByteArrayOutputStream os = new ByteArrayOutputStream(bytes.length); + if (!image.compressToJpeg(new Rect(0, 0, width, height), 100, os)) { + return null; + } + byte[] tmp = os.toByteArray(); + Bitmap bmp = BitmapFactory.decodeByteArray(tmp, 0, tmp.length); + return bmp; + } } diff --git a/idcardcamera/src/main/java/com/wildma/idcardcamera/utils/ScreenUtils.java b/idcardcamera/src/main/java/com/wildma/idcardcamera/utils/ScreenUtils.java new file mode 100644 index 0000000..343fd1d --- /dev/null +++ b/idcardcamera/src/main/java/com/wildma/idcardcamera/utils/ScreenUtils.java @@ -0,0 +1,33 @@ +package com.wildma.idcardcamera.utils; + +import android.content.Context; + +/** + * Author wildma + * Github https://github.com/wildma + * Date 2018/12/30 + * Desc ${屏幕相关工具类} + */ +public class ScreenUtils { + + /** + * 获取屏幕宽度(px) + * + * @param context + * @return + */ + public static int getScreenWidth(Context context) { + return context.getResources().getDisplayMetrics().widthPixels; + } + + + /** + * 获取屏幕高度(px) + * + * @param context + * @return + */ + public static int getScreenHeight(Context context) { + return context.getResources().getDisplayMetrics().heightPixels; + } +} diff --git a/idcardcamera/src/main/res/layout-land/activity_camera.xml b/idcardcamera/src/main/res/layout-land/activity_camera.xml deleted file mode 100644 index d8d9ee4..0000000 --- a/idcardcamera/src/main/res/layout-land/activity_camera.xml +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/idcardcamera/src/main/res/layout/activity_camera.xml b/idcardcamera/src/main/res/layout/activity_camera.xml index d8d9ee4..9853c29 100644 --- a/idcardcamera/src/main/res/layout/activity_camera.xml +++ b/idcardcamera/src/main/res/layout/activity_camera.xml @@ -77,6 +77,7 @@