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示例项目后,对其引入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就可以了。
使用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发布的库:
在根目录下的build.gradle中加入jitpack.io的仓库地址
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
在app的build.gradle 中加入依赖
dependencies {
implementation 'com.github.username:demolib:Tag'
}
原始项目源码zxing
该项目实现了扫一扫的基本功能如:扫描二维码,扫描条码,闪光灯,解析二维码图片,解析条码图片,生成二维码,使用起来也非常方便。
上面的库我在使用过程中遇到了一些问题,因为库依赖于AppCompat主题,所以应用的主题Theme必须是AppComat的,这一点让我的应用因没有使用AppComat主题而无法使用该库(试了改主题,但界面乱了),所以下载了该源码,将其中对AppCompat依赖的东西全部去除了,然后我重新通过JitPack发布了一个版本供自己的项目使用。修改后的Zxinglib源码库
在根目录 build.gradle 中加入
allprojects {
repositories {
google()
mavenCentral() //如果其它仓库被墙了,使用这个
jcenter()
maven { url 'https://jitpack.io' }
}
}
在app目录的 build.gradle 中加入
dependencies {
...
/*添加依赖*/
implementation 'com.github.houxuexianhan:zxinglib:1.1.1'
}
demo使用的权限申请是严大的一个开源库,地址:https://github.com/yanzhenjie/AndPermission 感谢严大!
dependencies {
...
/*添加依赖*/
implementation 'com.yanzhenjie:permission:2.0.0-rc4'
}
需要申请的权限
Manifest.permission.CAMERA
Manifest.permission.READ_EXTERNAL_STORAGE
使用默认配置项,两行代码即可
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(),否则会接收不到结果.
注意: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);
}
}
}
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;
}