Android 扫一扫lib库 通过github和jitpack.io发布

Android配置github和git

1)首先在gitgub官网注册账号(已有则略过)。
2)然后在android studio 的File->Settins->Version Control->GitHub配置github连接参数,其中Host填github.com,Auth Type选Password,Login和Password分为为账号密码,点击Test看是否连接成功。
3)下载并安装Git,切换到Git配置项Version Control->Git,选择安装的git执行程序路径(例如D:\Program Files\Git\bin\git.exe),点Test是否成功。

将Android项目Push到GitHub

新建好一个Android示例项目后,对其引入git版本控制。可以通过VCS->Enable Version Control Integration->Git 或 VCS->Import into Version Control->Create Git Repository 方式引入,两种方式都在你的项目目录下生成了一个.git的隐藏文件夹,它就是这个项目的git本地仓库,之后你的项目中的文件会有不同的颜色,字体红色代表未add添加到本地仓库,绿色代表已add添加但未提交commit,黑色代表已经提交commit到本地仓库,而蓝色代表文件修改了未提交commit。
可以通过选择单个或多个文件右键菜单中Git->Add 或者VCS->Git->Add 来将新创建的文件添加到本地仓库中,然后Commit到本地仓库 (当然也可以不用Add而直接VCS-Commit…)。
通过VCS->Import into Version Control->Share Project on GitHub,将项目push到GitHub,首次操作会提示让你创建GitHub远程仓库,创建成功后会将项目Push过去,登录Github网站你就能看到了。之后文件修改后Commit到本地仓库,只需要VCS->Git->Push就可以了。
还有一种方式是先在GitHub上新建一个仓库(例如Demo),然后通过VCS->Git->Remotes… 点 + 号添加远程仓库,Name任意取用于标识远程仓库,URL未GitHub上创建的仓库路径,例如https://github.com/username/Demo.git 通过这种方式也可将本地仓库与远程仓库关联,接下来只需要VCS-Git->Push就可以了。

在Jitpack.io上发布Android library

使用GitHub账号登录Jitpack官网,可以看到GitHub上的项目。并不是任意项目都可以发布的,可以发布的是Android library。

*创建Android Library
新建完项目后,然后新建一个Module,File->New->New Module ,选择Android Library。
为了使应用依赖于该library模块,File->Project Structure… ,在左边的模块列表中点击app,切到Dependences,点 + 添加 Module dependency ,选择刚创建的Library。这实际上是在app的build.gradle中加入了这行代码 implementation project(':mytestlibrary')

这样一个Android Library就算创建好了,把它Push到GitHub仓库。但是JitPack仍然无法发布它,还需要添加一些东西。参考官网Publish an Android library 。
为了可以在JitPack上构建项目,需要添加android-maven插件
如果使用的是Gradle 4.6以上的版本,需要在项目根目录下的build.gradle中添加

buildscript { 
  dependencies {
    classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' // Add this line

在库的library/build.gradle 中添加

apply plugin: 'com.github.dcendents.android-maven'  

 group='com.github.YourUsername'

加入上面的代码修改完成后Push到GitHub,然后在GitHub上创建一个release或添加一个git tag 。如果未加入上面的代码,JitPack将会使用最新的android-maven插件来构建项目(可能会出错)
注意: 需要确保项目的gradle/wrapper目录下的两个文件gradle-wrapper.jar和gradle-wrapper.properties Push到了GitHub仓库,因为JitPack会使用gradle-wrapper.jar来构建项目,如果未找到,它会使用最新的gradle版本来构建,但通常会构建失败。

在JitPack官网登录GitHub账号,点及发布的项目,或者Look Up ,将会列出该项目发布的各个Release,如果编译成功,Status 会显示绿色的Get it,否则会显示report 按钮,可以查看log文件。

使用JitPack发布的库

其他人可以通过如下方式使用JitPack发布的库:
在根目录下的build.gradle中加入jitpack.io的仓库地址

allprojects {
 repositories {
    jcenter()
    maven { url "https://jitpack.io" }
 }
}

在app的build.gradle 中加入依赖

dependencies {
   implementation 'com.github.username:demolib:Tag'
}

扫一扫Android Library

原始项目源码zxing
该项目实现了扫一扫的基本功能如:扫描二维码,扫描条码,闪光灯,解析二维码图片,解析条码图片,生成二维码,使用起来也非常方便。

上面的库我在使用过程中遇到了一些问题,因为库依赖于AppCompat主题,所以应用的主题Theme必须是AppComat的,这一点让我的应用因没有使用AppComat主题而无法使用该库(试了改主题,但界面乱了),所以下载了该源码,将其中对AppCompat依赖的东西全部去除了,然后我重新通过JitPack发布了一个版本供自己的项目使用。修改后的Zxinglib源码库

1)添加依赖

在根目录 build.gradle 中加入

allprojects {
    repositories {
        google()
        mavenCentral()  //如果其它仓库被墙了,使用这个
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

在app目录的 build.gradle 中加入

dependencies {
 ...   
   /*添加依赖*/
   implementation 'com.github.houxuexianhan:zxinglib:1.1.1'
}

2)添加权限依赖

demo使用的权限申请是严大的一个开源库,地址:https://github.com/yanzhenjie/AndPermission 感谢严大!

dependencies {
 ...   
   /*添加依赖*/
   implementation 'com.yanzhenjie:permission:2.0.0-rc4'
}

需要申请的权限
Manifest.permission.CAMERA
Manifest.permission.READ_EXTERNAL_STORAGE

3)跳转到扫一扫界面

使用默认配置项,两行代码即可

Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent, REQUEST_CODE_SCAN);

自定义配置项

Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
/*ZxingConfig是配置类
*可以设置是否显示底部布局,闪光灯,相册,
* 是否播放提示音  震动
* 设置扫描框颜色等
* 也可以不传这个参数
* */
ZxingConfig config = new ZxingConfig();
config.setPlayBeep(true);//是否播放扫描声音 默认为true
config.setShake(true);//是否震动  默认为true
config.setDecodeBarCode(false);//是否扫描条形码 默认为true
config.setReactColor(R.color.colorAccent);//设置扫描框四个角的颜色 默认为淡蓝色
config.setFrameLineColor(R.color.colorAccent);//设置扫描框边框颜色 默认无色
config.setFullScreenScan(false);//是否全屏扫描  默认为true  设为false则只会在扫描框中扫描
intent.putExtra(Constant.INTENT_ZXING_CONFIG, config);
startActivityForResult(intent, REQUEST_CODE_SCAN);

对于Fragment,请直接使用startActivityForResult(),而不要使用requireActivity().startActivityForResult(),否则会接收不到结果.

4)接收扫码结果

注意:Constant.CODED_CONTENT引的是这个com.yzq.zxinglibrary.common.Constant

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 扫描二维码/条码回传
        if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
            if (data != null) {

                String content = data.getStringExtra(Constant.CODED_CONTENT);
                result.setText("扫描结果为:" + content);
            }
        }
    }

5)生成二维码

String contentEtString = contentEt.getText().toString().trim();
                
      if (TextUtils.isEmpty(contentEtString)) {
            Toast.makeText(this, "contentEtString不能为空", Toast.LENGTH_SHORT).show();
            return;
        }
        Bitmap bitmap = null;
        try {
            /*
            * contentEtString:字符串内容
            * w:图片的宽
            * h:图片的高
            * logo:不需要logo的话直接传null
            * */

            Bitmap logo = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
            bitmap = CodeCreator.createQRCode(contentEtString, 400, 400, logo);
        } catch (WriterException e) {
            e.printStackTrace();
        }

附上工具类:

 //  需要Activity的 onActivityResult捕获解码结果
    public static void scanForActivity(final Activity activity, final int requestCode, final String title){
        AndPermission.with(activity).runtime()
                .permission(Permission.CAMERA, Permission.READ_EXTERNAL_STORAGE)
                .onGranted(new Action>() {
                    @Override
                    public void onAction(List permissions) {
                        Intent intent = new Intent(activity, CaptureActivity.class);
                        intent.putExtra(Constant.INTENT_ZXING_CONFIG, getZxingConfig(title));
                        activity.startActivityForResult(intent, requestCode);
                    }
                })
                .onDenied(new Action>() {
                    @Override
                    public void onAction(List permissions) {
                        Uri packageURI = Uri.parse("package:" + activity.getPackageName());
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        activity.startActivity(intent);
                        Toast.makeText(activity, "没有权限无法扫描呦", Toast.LENGTH_LONG).show();
                    }
                }).start();
    }
    //再Fragment中扫描
    public static void scanForFragment(final Fragment fragment, final int requestCode, final String title){
        AndPermission.with(fragment).runtime()
                .permission(Permission.CAMERA, Permission.READ_EXTERNAL_STORAGE)
                .onGranted(new Action>() {
                    @Override
                    public void onAction(List permissions) {
                        Intent intent = new Intent(fragment.requireActivity(), CaptureActivity.class);
                        intent.putExtra(Constant.INTENT_ZXING_CONFIG, getZxingConfig(title));
                        fragment.startActivityForResult(intent, requestCode);
                    }
                })
                .onDenied(new Action>() {
                    @Override
                    public void onAction(List permissions) {
                        Uri packageURI = Uri.parse("package:" + fragment.requireActivity().getPackageName());
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        fragment.startActivity(intent);
                        Toast.makeText(fragment.requireActivity(), "没有权限无法扫描呦", Toast.LENGTH_LONG).show();
                    }
                }).start();
    }
    private static ZxingConfig getZxingConfig(String title){
        /*ZxingConfig是配置类
         *可以设置是否显示底部布局,闪光灯,相册,
         * 是否播放提示音  震动
         * 设置扫描框颜色等
         * 也可以不传这个参数
         * */
        ZxingConfig config = new ZxingConfig();
        config.setPlayBeep(true);//是否播放扫描声音 默认为true
        config.setShake(true);//是否震动  默认为true
        config.setDecodeBarCode(true);//是否扫描条形码 默认为true
        config.setReactColor(R.color.white);//设置扫描框四个角的颜色 默认为淡蓝色
        config.setFrameLineColor(R.color.white);//设置扫描框边框颜色 默认无色
        config.setFullScreenScan(false);//是否全屏扫描  默认为true  设为false则只会在扫描框中扫描
        config.setTitle(title);
        return config;
    }

你可能感兴趣的:(Android)