这是一个系列,咱们将其命名为android最佳实践,若是你尚未看以前的文章:android
android最佳实践(二)github
android最佳实践(三)segmentfault
android最佳实践(五)maven
上一节,咱们编写了contact模块,极大的简化了联系人的获取,并且提供了两种方式,一种是经过手机内置app获取联系人手机号码,另一种是经过自写UI,来获取获得联系人手机号码。
这一节,咱们将会编写qrcode模块,该模块致力于简化扫描二维码的代码编写,同时也加上了Android 6.0的动态权限检查。ide
那么咱们开始吧。gradle
现阶段,咱们已经有两个模块了,那么其对应得buildToolsVersion等都是同样,那之后模块多了,更改这些参数是否是会很是麻烦,有人说了我能够在project中定义变量,而后在各个子模块中引用,那么真的有必要吗,是否有更简单的办法。ui
下面是个人project中的build.gradle文件,其含义是除了app模块,其余子模块一概为依赖模块,且定义了一些参数和内部库,当咱们的子模块有本身特殊的库,你须要复写dependencies就能够了。this
subprojects{ configure(allprojects - project(':app')) { apply plugin: 'com.android.library' android { compileSdkVersion 23 buildToolsVersion '23.0.2' defaultConfig { minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } lintOptions { abortOnError false } } dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' } apply from: '../gradle/maven_push.gradle' } }
那么例如咱们的扫描二维码模块,你就应该在该子模块的gradle文件中添加以下代码:
dependencies{ compile 'com.google.zxing:core:3.2.0' }
该含义为添加google提供的zxing依赖包,你们能够根据zxing依赖包进行二次开发,可是你会发现,使用zxing难度颇大,为什么没有人进行其相关的二次封装,我可以更简单的调用呢,这就是我写该模块的目的。
该模块使用工厂模式,将实现和接口分离,同时为将来提供多样化的产品带来可能,用户可定制扫描二维码界面。同时提供了,该模块适合于activity和fragment以及v4包中的fragment。
在你的activity或者你的fragment中调用:
QrcodeFactory.newQrcode(this).start();
由于该方法会调用相关的界面,因此若是你想接收数据,须要在该类中重写onActivityResult方法,在该方法内部调用QrCode模块的onActivityResult方法。例如这样:
@Override public void onActivityResult(int requestCode, int resultCode, final Intent data) { mQrcode.onActivityResult(requestCode, resultCode, data, new QrcodeCallback() { @Override public void onSuccess(@NonNull QrcodeInfo info) { String textInfo = "二维码信息" + info.getResult() + "图片高度" + info.getHeight() + "图片宽度" + info.getWidth(); mText.setText(textInfo); mImageView.setImageBitmap(info.getQrCodeImage()); } @Override public void onFailed(@NonNull String errMsg) { mText.setText(errMsg); } }); }
当你的app须要Android6.0的适配,你须要对获取动态权限结果,你须要在该类中重写onRequestPermissionsResult方法,例如这样:
@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { mQrcode.onRequestPermissionsResult(requestCode, permissions, grantResults, new com.neu.qrcode.callback.PermissionResultCallback() { @Override public void denyPermission() { mText.setText("App无权限"); } }); }
扫描二维码模块,由于每一个公司都想有本身的扫描界面,因此自定义化扫描界面显得尤其重要,而利用camera自定义扫描界面,代码量和难度颇大,该项目后续会添加部分UI模板,适用于扫描界面的定制。你们能够fork或star个人github,https://github.com/neuyu/android-best-practices。