借鉴GitHub:https://github.com/smartown/CertificateCamera

做之前可以在GitHub上看看效果是否符合自己的要求。因为之前导入他人Demo因版本不同总是出现各种问题,所以我这里就是把他其中的代码给粘贴出来,不知是否违规,还望大家提醒。其中的图片资源、values下、drawable下的资源我就不写了。

一、先看拍照时页面布局,有两种,其一在layout中,其二在layout-land中,也就是说你需要在res下创建一个名为layout-land的文件夹。

1. layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000"><com.example.zyt.mynewimageview.img.CameraPreviewandroid:id="@+id/camera_surface"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="@color/preview_mock"android:gravity="center"android:text="@string/touch_to_focus"android:textColor="#afff"android:textSize="16dp" /><LinearLayoutandroid:id="@+id/camera_crop_container"android:layout_width="0dp"android:layout_height="0dp"android:orientation="horizontal"><Viewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="@color/preview_mock" /><ImageViewandroid:id="@+id/camera_crop"android:layout_width="0dp"android:layout_height="0dp"android:scaleType="fitXY" /><Viewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="@color/preview_mock" /></LinearLayout></LinearLayout><FrameLayoutandroid:layout_width="match_parent"android:layout_height="136dp"android:background="@color/preview_mock"><LinearLayoutandroid:id="@+id/camera_option"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/camera_close"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/camera_close" /><ImageViewandroid:id="@+id/camera_take"android:layout_width="72dp"android:layout_height="72dp"android:layout_margin="32dp"android:src="@mipmap/camera_take" /><ImageViewandroid:id="@+id/camera_flash"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/camera_flash_off" /></LinearLayout><LinearLayoutandroid:id="@+id/camera_result"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="horizontal"android:visibility="gone"><ImageViewandroid:id="@+id/camera_result_cancel"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/camera_result_cancel" /><ImageViewandroid:id="@+id/camera_result_ok"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginLeft="80dp"android:src="@mipmap/camera_result_ok" /></LinearLayout></FrameLayout></LinearLayout>
</RelativeLayout>

2. layout-land

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#000"><com.example.zyt.mynewimageview.img.CameraPreviewandroid:id="@+id/camera_surface"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><LinearLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:orientation="horizontal"><Viewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:background="@color/preview_mock" /><LinearLayoutandroid:id="@+id/camera_crop_container"android:layout_width="0dp"android:layout_height="0dp"android:orientation="vertical"><Viewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="@color/preview_mock" /><ImageViewandroid:id="@+id/camera_crop"android:layout_width="0dp"android:layout_height="0dp"android:scaleType="fitXY" /><TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="@color/preview_mock"android:gravity="center"android:text="@string/touch_to_focus"android:textColor="#afff"android:textSize="16dp" /></LinearLayout></LinearLayout><FrameLayoutandroid:layout_width="136dp"android:layout_height="match_parent"android:background="@color/preview_mock"><LinearLayoutandroid:id="@+id/camera_option"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/camera_flash"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/camera_flash_off" /><ImageViewandroid:id="@+id/camera_take"android:layout_width="72dp"android:layout_height="72dp"android:layout_margin="32dp"android:src="@mipmap/camera_take" /><ImageViewandroid:id="@+id/camera_close"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/camera_close" /></LinearLayout><LinearLayoutandroid:id="@+id/camera_result"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"android:visibility="gone"><ImageViewandroid:id="@+id/camera_result_ok"android:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/camera_result_ok" /><ImageViewandroid:id="@+id/camera_result_cancel"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginTop="80dp"android:src="@mipmap/camera_result_cancel" /></LinearLayout></FrameLayout></LinearLayout>
</RelativeLayout>

二、实现布局

<?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"><ImageViewandroid:id="@+id/main_image"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:scaleType="fitCenter" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="8dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="48dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/shape_button"android:gravity="center"android:onClick="frontIdCard"android:text="身份证正面"android:textColor="#555"android:textSize="16dp" /><TextViewandroid:layout_width="0dp"android:layout_height="48dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/shape_button"android:gravity="center"android:onClick="backIdCard"android:text="身份证反面"android:textColor="#555"android:textSize="16dp" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="48dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/shape_button"android:gravity="center"android:onClick="businessLicensePortrait"android:text="营业执照竖版"android:textColor="#555"android:textSize="16dp" /><TextViewandroid:layout_width="0dp"android:layout_height="48dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/shape_button"android:gravity="center"android:onClick="businessLicenseLandscape"android:text="营业执照横版"android:textColor="#555"android:textSize="16dp" /></LinearLayout></LinearLayout></LinearLayout>

三、工具类CameraUtils

public class CameraUtils {/*** Check if this device has a camera* 检查这个设备是否有摄像头*/public static boolean hasCamera(Context context) {if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {// this device has a camerareturn true;} else {// no camera on this devicereturn false;}}/*** A safe way to get an instance of the Camera object.* 获取摄像机对象实例的安全方法。*/public static Camera openCamera() {Camera c = null;try {c = 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}
}

四、自定义控件CameraPreview

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {private static String TAG = CameraPreview.class.getName();private Camera camera;public CameraPreview(Context context) {super(context);init();}public CameraPreview(Context context, AttributeSet attrs) {super(context, attrs);init();}public CameraPreview(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}@TargetApi(Build.VERSION_CODES.LOLLIPOP)public CameraPreview(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);init();}private void init() {SurfaceHolder surfaceHolder = getHolder();surfaceHolder.addCallback(this);surfaceHolder.setKeepScreenOn(true);surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}public void surfaceCreated(SurfaceHolder holder) {camera = CameraUtils.openCamera();if (camera != null) {try {camera.setPreviewDisplay(holder);Camera.Parameters parameters = camera.getParameters();if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {//竖屏拍照时,需要设置旋转90度,否者看到的相机预览方向和界面方向不相同camera.setDisplayOrientation(90);parameters.setRotation(90);} else {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);}camera.setParameters(parameters);camera.startPreview();focus();} catch (Exception e) {Log.d(TAG, "Error setting camera preview: " + e.getMessage());try {Camera.Parameters parameters = camera.getParameters();if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {//竖屏拍照时,需要设置旋转90度,否者看到的相机预览方向和界面方向不相同camera.setDisplayOrientation(90);parameters.setRotation(90);} else {camera.setDisplayOrientation(0);parameters.setRotation(0);}camera.setParameters(parameters);camera.startPreview();focus();} catch (Exception e1) {e.printStackTrace();camera = null;}}}}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 最佳尺寸*/private Camera.Size getBestSize(List<Camera.Size> sizes) {Camera.Size bestSize = null;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;}}}}return bestSize;}/*** 释放资源*/private void release() {if (camera != null) {camera.stopPreview();camera.release();camera = null;}}/*** 对焦,在CameraActivity中触摸对焦*/public void focus() {if (camera != null) {camera.autoFocus(null);}}/*** 开关闪光灯** @return 闪光灯是否开启*/public boolean switchFlashLight() {if (camera != null) {Camera.Parameters parameters = camera.getParameters();if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_OFF)) {parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);camera.setParameters(parameters);return true;} else {parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);camera.setParameters(parameters);return false;}}return false;}/*** 拍摄照片** @param pictureCallback 在pictureCallback处理拍照回调*/public void takePhoto(Camera.PictureCallback pictureCallback) {if (camera != null) {camera.takePicture(null, null, pictureCallback);}}public void startPreview() {if (camera != null) {camera.startPreview();}}}

五、相机CameraActivity

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 TYPE_COMPANY_PORTRAIT = 3;/*** 拍摄类型-横版营业执照*/public final static int TYPE_COMPANY_LANDSCAPE = 4;public final static int REQUEST_CODE = 0X13;public final static int RESULT_CODE = 0X14;/*** @param type {@link #TYPE_IDCARD_FRONT}*             {@link #TYPE_IDCARD_BACK}*             {@link #TYPE_COMPANY_PORTRAIT}*             {@link #TYPE_COMPANY_LANDSCAPE}*/public static void openCertificateCamera(Activity activity, int type) {Intent intent = new Intent(activity, CameraActivity.class);intent.putExtra("type", type);activity.startActivityForResult(intent, REQUEST_CODE);}/*** @return 结果文件路径*/public static String getResult(Intent data) {if (data != null) {return data.getStringExtra("result");}return "";}private CameraPreview cameraPreview;private View containerView;private ImageView cropView;private ImageView flashImageView;private View optionView;private View resultView;private int type;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);type = getIntent().getIntExtra("type", 0);if (type == TYPE_COMPANY_PORTRAIT) {setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);} else {setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}setContentView(R.layout.activity_camera);cameraPreview = (CameraPreview) findViewById(R.id.camera_surface);//获取屏幕最小边,设置为cameraPreview较窄的一边float screenMinSize = Math.min(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels);//根据screenMinSize,计算出cameraPreview的较宽的一边,长宽比为标准的16:9float maxSize = screenMinSize / 9.0f * 16.0f;RelativeLayout.LayoutParams layoutParams;if (type == TYPE_COMPANY_PORTRAIT) {layoutParams = new RelativeLayout.LayoutParams((int) screenMinSize, (int) maxSize);} else {layoutParams = new RelativeLayout.LayoutParams((int) maxSize, (int) screenMinSize);}layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);cameraPreview.setLayoutParams(layoutParams);containerView = findViewById(R.id.camera_crop_container);cropView = (ImageView) findViewById(R.id.camera_crop);if (type == TYPE_COMPANY_PORTRAIT) {float width = (int) (screenMinSize * 0.8);float height = (int) (width * 43.0f / 30.0f);LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) height);LinearLayout.LayoutParams cropParams = new LinearLayout.LayoutParams((int) width, (int) height);containerView.setLayoutParams(containerParams);cropView.setLayoutParams(cropParams);} else if (type == TYPE_COMPANY_LANDSCAPE) {float height = (int) (screenMinSize * 0.8);float width = (int) (height * 43.0f / 30.0f);LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams((int) width, ViewGroup.LayoutParams.MATCH_PARENT);LinearLayout.LayoutParams cropParams = new LinearLayout.LayoutParams((int) width, (int) height);containerView.setLayoutParams(containerParams);cropView.setLayoutParams(cropParams);} else {float height = (int) (screenMinSize * 0.75);float width = (int) (height * 75.0f / 47.0f);LinearLayout.LayoutParams containerParams = new LinearLayout.LayoutParams((int) width, ViewGroup.LayoutParams.MATCH_PARENT);LinearLayout.LayoutParams cropParams = new LinearLayout.LayoutParams((int) width, (int) height);containerView.setLayoutParams(containerParams);cropView.setLayoutParams(cropParams);}switch (type) {case TYPE_IDCARD_FRONT:cropView.setImageResource(R.mipmap.camera_idcard_front);break;case TYPE_IDCARD_BACK:cropView.setImageResource(R.mipmap.camera_idcard_back);break;case TYPE_COMPANY_PORTRAIT:cropView.setImageResource(R.mipmap.camera_company);break;case TYPE_COMPANY_LANDSCAPE:cropView.setImageResource(R.mipmap.camera_company_landscape);break;}flashImageView = (ImageView) findViewById(R.id.camera_flash);optionView = findViewById(R.id.camera_option);resultView = findViewById(R.id.camera_result);cameraPreview.setOnClickListener(this);findViewById(R.id.camera_close).setOnClickListener(this);findViewById(R.id.camera_take).setOnClickListener(this);flashImageView.setOnClickListener(this);findViewById(R.id.camera_result_ok).setOnClickListener(this);findViewById(R.id.camera_result_cancel).setOnClickListener(this);}@Overridepublic void onClick(View v) {int id = v.getId();if (id == R.id.camera_surface) {cameraPreview.focus();} else if (id == R.id.camera_close) {finish();} else if (id == R.id.camera_take) {takePhoto();} else if (id == R.id.camera_flash) {boolean isFlashOn = cameraPreview.switchFlashLight();flashImageView.setImageResource(isFlashOn ? R.mipmap.camera_flash_on : R.mipmap.camera_flash_off);} else if (id == R.id.camera_result_ok) {goBack();} else if (id == R.id.camera_result_cancel) {optionView.setVisibility(View.VISIBLE);cameraPreview.setEnabled(true);resultView.setVisibility(View.GONE);cameraPreview.startPreview();}}private void takePhoto() {optionView.setVisibility(View.GONE);cameraPreview.setEnabled(false);cameraPreview.takePhoto(new Camera.PictureCallback() {@Overridepublic void onPictureTaken(final byte[] data, Camera camera) {camera.stopPreview();//子线程处理图片,防止ANRnew Thread(new Runnable() {@Overridepublic void run() {try {File originalFile = getOriginalFile();FileOutputStream originalFileOutputStream = new FileOutputStream(originalFile);originalFileOutputStream.write(data);originalFileOutputStream.close();Bitmap bitmap = BitmapFactory.decodeFile(originalFile.getPath());//计算裁剪位置float left, top, right, bottom;if (type == TYPE_COMPANY_PORTRAIT) {left = (float) cropView.getLeft() / (float) cameraPreview.getWidth();top = ((float) containerView.getTop() - (float) cameraPreview.getTop()) / (float) cameraPreview.getHeight();right = (float) cropView.getRight() / (float) cameraPreview.getWidth();bottom = (float) containerView.getBottom() / (float) cameraPreview.getHeight();} else {left = ((float) containerView.getLeft() - (float) cameraPreview.getLeft()) / (float) cameraPreview.getWidth();top = (float) cropView.getTop() / (float) cameraPreview.getHeight();right = (float) containerView.getRight() / (float) cameraPreview.getWidth();bottom = (float) cropView.getBottom() / (float) cameraPreview.getHeight();}//裁剪及保存到文件Bitmap cropBitmap = 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()));final File cropFile = getCropFile();BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(cropFile));cropBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);bos.flush();bos.close();runOnUiThread(new Runnable() {@Overridepublic void run() {resultView.setVisibility(View.VISIBLE);}});return;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}runOnUiThread(new Runnable() {@Overridepublic void run() {optionView.setVisibility(View.VISIBLE);cameraPreview.setEnabled(true);}});}}).start();}});}/*** @return 拍摄图片原始文件*/private File getOriginalFile() {switch (type) {case TYPE_IDCARD_FRONT:return new File(getExternalCacheDir(), "idCardFront.png");case TYPE_IDCARD_BACK:return new File(getExternalCacheDir(), "idCardBack.png");case TYPE_COMPANY_PORTRAIT:case TYPE_COMPANY_LANDSCAPE:return new File(getExternalCacheDir(), "companyInfo.jpg");}return new File(getExternalCacheDir(), "picture.jpg");}/*** @return 拍摄图片裁剪文件*/private File getCropFile() {switch (type) {case TYPE_IDCARD_FRONT:return new File(getExternalCacheDir(), "idCardFrontCrop.jpg");case TYPE_IDCARD_BACK:return new File(getExternalCacheDir(), "idCardBackCrop.jpg");case TYPE_COMPANY_PORTRAIT:case TYPE_COMPANY_LANDSCAPE:return new File(getExternalCacheDir(), "companyInfoCrop.jpg");}return new File(getExternalCacheDir(), "pictureCrop.jpg");}/*** 点击对勾,使用拍照结果,返回对应图片路径*/private void goBack() {Intent intent = new Intent();intent.putExtra("result", getCropFile().getPath());setResult(RESULT_CODE, intent);finish();}}

六、实现MainActivity

public class MainActivity extends AppCompatActivity {private ImageView imageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = (ImageView) findViewById(R.id.main_image);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == CameraActivity.REQUEST_CODE && resultCode == CameraActivity.RESULT_CODE) {//获取文件路径,显示图片final String path = CameraActivity.getResult(data);if (!TextUtils.isEmpty(path)) {imageView.setImageBitmap(BitmapFactory.decodeFile(path));}}}/*** 拍摄证件照片** @param type 拍摄证件类型*/private void takePhoto(int type) {if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 0x12);return;}CameraActivity.openCertificateCamera(this, type);}/*** 身份证正面*/public void frontIdCard(View view) {takePhoto(CameraActivity.TYPE_IDCARD_FRONT);}/*** 身份证反面*/public void backIdCard(View view) {takePhoto(CameraActivity.TYPE_IDCARD_BACK);}/*** 营业执照竖版*/public void businessLicensePortrait(View view) {takePhoto(CameraActivity.TYPE_COMPANY_PORTRAIT);}/*** 营业执照横版*/public void businessLicenseLandscape(View view) {takePhoto(CameraActivity.TYPE_COMPANY_LANDSCAPE);}}

七、清单文件AndroidManifest

1. 注册CameraActivity

    <activityandroid:name=".img.CameraActivity"android:screenOrientation="landscape"android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" />

2. 权限

    <uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.FLASHLIGHT" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-featureandroid:name="android.hardware.camera"android:required="true" /><uses-featureandroid:name="android.hardware.camera.autofocus"android:required="true" />

Android中身份证正反面、营业执照横竖版的拍摄和裁剪相关推荐

  1. Android中使用Drawable绘制横竖虚线

    横虚线 <shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape=&quo ...

  2. android 横屏竖屏设置,Android中强制设置横屏与竖屏,与横竖屏生命周期的设置

    许多小的知识点,是面试中经常会被提问到的,面试题也方式也会不一样,比如,让你在配置文件中设置Activity 为竖屏模式,答题方式是把相关的配置节点代码也给写出来,多少有点懵逼... 全屏 在Acti ...

  3. android中的横竖屏切换,Android中横竖屏切换时Activity的生命周期

    Android中横竖屏切换时Activity的生命周期执行情况 1.默认情况下生命周期 (1)第一次进入界面 11-17 13:55:18.452: E/ImageListActivity(10586 ...

  4. android 侧滑删除功能,200行代码让你在Android中完美实现iOS版侧滑删除效果

    使用几个月的IOS之后,发现IOS中侧滑删除俺就 大家好,自己开始学习Android已经差不多半年了吧,前前后后看了不少的博客获益匪浅.渐渐的随着技术的提升,慢慢感觉网上其它的一些功能的实现又不是那么 ...

  5. android中AndroidManifest.xml 的解析 (转)

    虽然,也做了android开发一年多,可一直有的东西一直了解的不透彻,有时间会把好的东西,分享出来,大家一起学习进步,今天就从mainfest开始. 转自(http://my.eoe.cn/10876 ...

  6. Android实现身份证识别

    Android实现身份证识别(印刷文字识别-身份证识别-阿里云) 在做实名认证的时候客户要求要自动识别身份证上的个人信息,我们使用的是阿里云的OCR印刷文字识别-身份证识别 阿里云的文档写的还是很清楚 ...

  7. android中ADT和SDK的关系(转)

    ADT(Android Development Tools): 目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境中,安装ADT,为Android开发提供开发工具的升 ...

  8. Android中ExpandableListView的使用

    Android中ExpandableListView的使用 ExpandableListView是Android中可以实现下拉list的一个控件,具体的实现方法如下: 首先:在layout的xml文件 ...

  9. Android中关于cpu/cpuset/schedtune的应用

    Android中关于cpu/cpuset/schedtune的应用都是基于进程优先级的,根据不同优先级划分进程类型.AMS(ActivityManagerService)和PMS(PackageMan ...

最新文章

  1. ODP.NET调用存储需要使用事务
  2. mysql 5.6多实例_MySQL 5.6.x多实例配置
  3. MySQL最后一次查询耗时查询
  4. data transformation python_Python数据分析(方睿)
  5. D(X)=E(X^2)-E^2(X)
  6. 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)
  7. 什么是单工、半双工和双工通信?有哪些实际应用的例子
  8. 【易语言】五子棋源码
  9. mysql项目数据库文档_项目mysql数据库
  10. xtrabackup mysql 5.1_mysql 5.1 选哪个 xtrabackup
  11. idea ---- 快捷键
  12. 12.4!移动云 TeaTalk 即将抵达深圳,不要错过!
  13. 张广慧:云计算对游戏开发者的价值
  14. 三菱fx2n做从站的modbus通讯_三菱FX2N与昆仑通态(MCGS)无线编程口通讯例程
  15. apl脚本入门-控制语句
  16. python之路 jQuery学习笔记
  17. JavaScript---BOM和DOM
  18. linux yum用法,Linux系统yum的使用与说明
  19. python模拟登录163邮箱_python selenium模拟登陆163邮箱。
  20. 关于数据库中存储密码的加密

热门文章

  1. nodejs调用webservice接口(https)
  2. 刷机相关的Android的安全
  3. 编程规范和范例(转)-续
  4. Android各厂商自启动管理开发
  5. windows如何查看剪贴板历史
  6. sharding-jdbc分库分表
  7. opencv实现行人检测(C++)
  8. 【我的第一个目标检测课题】3、Retinanet网络的学习与实现+扩展
  9. 使用MindStudio的HPO界面工具进行调优
  10. MySQL基础学习(续)