前言
以前使用二維碼相關(guān)掃描的時(shí)候贬养,一直都是調(diào)用別人封裝的掃描庫(kù),但是多少在使用時(shí)會(huì)感覺(jué)有些懵逼琴庵,特別是需要自定義掃描界面的時(shí)候误算。于是仰美,由于近段時(shí)間也是涉及到掃描的問(wèn)題。然后結(jié)合網(wǎng)上一些大神的處理和一些庫(kù)對(duì)于掃描相關(guān)的處理儿礼,我自己自己引用zxing
庫(kù)簡(jiǎn)單封裝了一個(gè)掃描庫(kù)咖杂,這里對(duì)掃描庫(kù)的使用做下簡(jiǎn)單介紹。
今天涉及內(nèi)容:
- 庫(kù)依賴
- 掃描庫(kù)具備功能介紹
- 主要類介紹
- 定制版掃描界面功能的使用
4.1 CaptureActivity 特點(diǎn)
4.2 調(diào)用定制版的掃描界面為啥要多寫(xiě)個(gè)類繼承CaptureActivity
4.3 定制版掃描界面示例
4.4 微調(diào)定制版掃描界面參數(shù) - 自定義掃描界面功能的使用
5.1 BaseCaptureActivity中主要方法介紹
5.2 自定義掃描界面 - 一維碼/二維碼生成
-
掃描
及一維碼/二維碼生成
在MainActivity
中的使用 - 效果圖和項(xiàng)目結(jié)構(gòu)圖
先來(lái)波效果圖
一.庫(kù)依賴
本掃描庫(kù)是基于zxing
庫(kù)的封裝蚊夫,需要在你項(xiàng)目的app_module
對(duì)應(yīng)的build.gradle
中添加如下依賴:
dependencies {
//zxing掃描庫(kù)
implementation 'com.google.zxing:core:3.4.0'
}
二. 掃描庫(kù)具備功能介紹
掃描庫(kù)具備一維碼/二維碼掃描
,生成一維碼/二維碼
的功能诉字。
三. 主要類介紹
此掃描庫(kù)涉及的類比較多,但是我們?cè)谑褂玫臅r(shí)候知纷,只要關(guān)注以下幾個(gè)類即可:
- BaseCaptureActivity —— 自定義掃描界面基類,需要自定義掃描界面的時(shí)候需要繼承此類
- CaptureActivity —— 定制版掃描界面基類,需要快速接入定制版掃描界面需要繼承此類
- EncodingUtils —— 一維碼壤圃、二維碼生成工具類
掃描庫(kù)具備自定義掃描界面
和使用定制版掃描界面
的功能,若想快速接入掃描功能,推薦使用定制版掃描界面
功能琅轧,若對(duì)掃描界面有特別的ui需求伍绳,可自行定義掃描界面,這時(shí)你可以使用自定義掃描界面
功能鹰晨。下面就以上兩個(gè)功能一 一講解墨叛。
四.定制版掃描界面功能的使用
當(dāng)你想使用庫(kù)內(nèi)的定制版掃描界面
功能的時(shí)候,你需要在你項(xiàng)目中寫(xiě)一個(gè)類繼承自CaptureActivity
模蜡。CaptureActivity
是一個(gè)定制版掃描界面的基類漠趁,其繼承于BaseCaptureActivity
。當(dāng)你想快速使用一個(gè)定制版掃描界面的時(shí)候忍疾,你可以寫(xiě)一個(gè)類繼承此類闯传。
4.1 CaptureActivity 特點(diǎn)
CaptureActivity
幾乎實(shí)現(xiàn)了一個(gè)掃描界面需要的所有功能。包括直接掃描二維碼
,閃光燈
,選擇相冊(cè)照片掃描
卤妒。CaptureActivity
實(shí)現(xiàn)了一個(gè)定制版的掃描界面甥绿。
4.2 調(diào)用定制版的掃描界面為啥要多寫(xiě)個(gè)類繼承CaptureActivity
Q:CaptureActivity
功能已經(jīng)很完美了,那為啥還要多寫(xiě)個(gè)子類去繼承它才能調(diào)用定制版的掃描界面,你秀你妹呢?
A: 呃,CaptureActivity雖然功能完美,可以加快開(kāi)發(fā)者接入一個(gè)掃描界面则披,但是介于以下幾點(diǎn)考慮:
- 掃描后是直接關(guān)閉掃描界面共缕,還是掃描后直接在掃描界面顯示掃描結(jié)果并錯(cuò)邏輯處理
- 掃描界面各控件
Pading
,margin
調(diào)整 - 掃描界面各控件
文字內(nèi)容
,文字大小
,文字顏色
調(diào)整 - 掃描界面各控件
圖標(biāo)切換
,圖標(biāo)大小
調(diào)整
基于以上幾點(diǎn)士复,則需要開(kāi)發(fā)者寫(xiě)一個(gè)子類繼承于CaptureActivity,當(dāng)有需求時(shí)用于微調(diào)定制版掃描界面參數(shù)图谷。以達(dá)到最快接入且具備一定靈活性的特點(diǎn)。
4.3 定制版掃描界面示例
繼承于CaptureActivity
阱洪,你可以像下面這樣寫(xiě)一個(gè)定制版掃描界面(以ScanActivity
為例):
/**
* Title:掃描界面
* description:
* autor:pei
* created on 2020/3/28
*/
public class ScanActivity extends CaptureActivity {
@Override
protected boolean scanFinish() {
//掃描完畢后便贵,是否立刻關(guān)閉掃描界面。true:是冗荸,false:否承璃。
return false;
}
@Override
protected void noAlbumPermission() {
}
@Override
protected void scanSuccess(String result, int width, int height) {
LogUtil.i("======掃描success的結(jié)果====result="+result);
}
@Override
protected void scanFailed(String result, int width, int height) {
LogUtil.i("======掃描failed的結(jié)果====result="+result);
}
}
假如你項(xiàng)目中界面A
需要集成定制版掃描界面ScanActivity
,那么你需要如下幾步處理:
- 你需要在你項(xiàng)目的
Androidmanifast.xml
中注冊(cè)ScanActivity
以用于界面跳轉(zhuǎn)蚌本。 - 在界面A中點(diǎn)擊按鈕時(shí)處理
打開(kāi)相機(jī)
,相冊(cè)讀寫(xiě)權(quán)限
等盔粹。涉及要修改的地方有Androidmanifast.xml
,fileprovider
以及android6.0+用戶手動(dòng)權(quán)限
這里就不詳細(xì)說(shuō)明了隘梨。 - 然后在具備權(quán)限的情況下,你可以在
界面A
通過(guò)以下方法跳轉(zhuǎn)到定制版掃描界面ScanActivity
:
//跳轉(zhuǎn)掃描界面
BaseCaptureActivity.startAct(Context context,Class<?>cls);
- 定制版掃描界面ScanActivity中幾個(gè)方法的解釋:
- scanFinish():返回true表示掃描出結(jié)果后會(huì)立馬關(guān)閉當(dāng)前掃描界面玻佩,那么掃描結(jié)果會(huì)在界面A中處理出嘹,若是此種情況席楚, 你無(wú)需在ScanActivity界面的scanSuccess(String result, int width, int height)和scanFailed(String result, int width, int height) 中做任何邏輯處理咬崔。你需要在界面A中處理掃描返回結(jié)果。在界面A的onActivityResult(int requestCode, int resultCode, @Nullable Intent data) 中做掃描結(jié)果的處理烦秩,你可以像下面這樣:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
BaseCaptureActivity.getCodeResult(requestCode, data, new OnScanResultListener() {
@Override
public void scanSuccess(String result, int width, int height) {
//掃描結(jié)果成功的處理
//....
}
@Override
public void scanFailed(String result, int width, int height) {
//掃描結(jié)果失敗的處理
//....
}
});
}
返回false表示掃描出結(jié)果后垮斯,不關(guān)閉掃描界面。這時(shí)你的掃描結(jié)果是在定制版掃描界面ScanActivity中處理只祠,而不是在界面A 中處理兜蠕。所以你要在定制版掃描界面ScanActivity的scanSuccess(String result, int width, int height)和scanFailed(String result, int width, int height)中做掃描成功和掃描失敗的處理,類似如下:
@Override
protected void scanSuccess(String result, int width, int height) {
//掃描成功的處理
//...
}
@Override
protected void scanFailed(String result, int width, int height) {
//掃描失敗的處理
//...
}
-
scanSuccess(String result, int width, int height)
和scanFailed(String result, int width, int height)
:當(dāng)scanFinish()
返回參數(shù)為false
(即掃描到結(jié)果后不立即關(guān)閉掃描界面)時(shí)抛寝,掃描結(jié)果成功和失敗的處理邏輯熊杨。
4.4 微調(diào)定制版掃描界面參數(shù)
以修改掃描界面返回鍵文字為例,可以在ScanActivity
中重載其父類CaptureActivity
的initData()
方法盗舰,并在其中修改返回鍵文字晶府,類似下面這樣:
/**
* Title:掃描界面
* description:
* autor:pei
* created on 2020/3/28
*/
public class ScanActivity extends CaptureActivity {
//其他方法,在此省略
//......
@Override
protected void initData() {
super.initData();
super.mTvBack.setText("大家好");
}
}
其他參數(shù)的微調(diào)類似钻趋,必要時(shí)也可重寫(xiě)父類CaptureActivity中的一些方法川陆,用以微調(diào)其他參數(shù)。
五.自定義掃描界面功能的使用
自定義掃描界面蛮位,你需要繼承BaseCaptureActivity
寫(xiě)一個(gè)自己的掃描界面较沪。BaseCaptureActivity
是一個(gè)掃描界面的基類,如果你需要自定義掃描界面失仁,那么你可以直接繼承它實(shí)現(xiàn)自己的掃描界面尸曼。
5.1 BaseCaptureActivity中主要方法介紹
BaseCaptureActivity
包含以下幾個(gè)靜態(tài)方法,便于開(kāi)發(fā)者在使用的過(guò)程中調(diào)用:
/**默認(rèn)跳轉(zhuǎn)**/
public static void startAct(Context context,Class<?>cls)
/**獲取二維碼內(nèi)容**/
public static void getCodeResult(int resultCode, Intent data, OnScanResultListener listener)
-
startAct(Context context,Class<?>cls)
:當(dāng)你項(xiàng)目中某個(gè)界面(如界面A
)需要使用到掃描功能的時(shí)候萄焦,你可以在界面A
通過(guò)點(diǎn)擊按鈕調(diào)用此方法跳轉(zhuǎn)到定制掃描界面
或自定義掃描界面
控轿。當(dāng)然, 前提是你已經(jīng)在點(diǎn)擊按鈕的時(shí)候做過(guò)了掃描所需權(quán)限的處理楷扬。 -
getCodeResult(int resultCode, Intent data, OnScanResultListener listener)
:當(dāng)你界面A
在調(diào)用完掃描界面并在關(guān)閉掃描界面后解幽,想在界面A
中接收 掃描數(shù)據(jù)回傳的時(shí)候,你可以在A界面
的onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
中調(diào)用此方法烘苹,用于接收掃描回傳值
其他主要方法介紹:
-
handleDecode(Result rawResult, Bundle bundle)
和handleDecode(String result)
方法躲株,主要用于將掃描結(jié)果回傳到界面A
的處理,此處只做了解镣衡,具體處理已經(jīng)在BaseCaptureActivity
基類中完成霜定。此方法只做了解即可档悠,無(wú)需開(kāi)發(fā)者調(diào)用。 -
restartPreviewAfterDelay(long delayMS)
:重復(fù)掃描望浩。此方法已在BaseCaptureActivity
內(nèi)部處理辖所,當(dāng)開(kāi)發(fā)這使用的是掃描完結(jié)果后仍停在掃描界面的模式時(shí),掃描框在獲取到掃描完結(jié)果的2秒之后磨德,繼續(xù)恢復(fù)掃描功能缘回。此方法只做了解即可,無(wú)需開(kāi)發(fā)者調(diào)用典挑。 -
defaultInitCrop(ViewGroup preLayout,ViewGroup scanLayout)
:默認(rèn)獲取掃描二維碼的尺寸(寬高),當(dāng)你在自定義掃描界面的時(shí)候酥宴,可以考慮在自定義掃描界面的initCrop()
方法中調(diào)用此方法。當(dāng)然,你也可以在自定義掃描界面的initCrop()
方法中自己實(shí)現(xiàn)獲取掃描二維碼的尺寸您觉。當(dāng)然拙寡,你也可以在自定義的掃描界面的initCrop()
中不做任何處理,這時(shí)琳水,你獲得的掃描結(jié)果中二維碼尺寸(寬高)將為0
肆糕。 -
Object[] getContentArray()
:虛擬方法,需要子類實(shí)現(xiàn)在孝。傳參及解釋如下:
/**
* 傳兩個(gè)參數(shù):第一個(gè)參數(shù)為int,布局id,如:R.layout.activity_capture
* 第二個(gè)參數(shù)為boolean,true表示掃描后立即關(guān)閉掃描界面,false表示掃描后不關(guān)閉掃描界面
* 第二個(gè)參數(shù)傳null時(shí),isScanedFinish取默認(rèn)值為true,即掃描后立即返回
* @return
*/
protected abstract Object[] getContentArray();
還有以下幾個(gè)虛擬方法诚啃,都是在自定義掃描界面的時(shí)候需要實(shí)現(xiàn)的:
protected abstract void initView();
protected abstract SurfaceView getSurfaceView();
/**初始化截取的矩形區(qū)域**/
protected abstract void initCrop();
protected abstract void setListener();
/**沒(méi)有相冊(cè)權(quán)限的處理**/
protected abstract void noAlbumPermission();
/**掃描成功返回的處理**/
protected abstract void scanSuccess(String result,int width,int height);
/**掃描失敗返回的處理**/
protected abstract void scanFailed(String result,int width,int height);
- 這里需要解釋的是,在自定義掃描的界面中必須含有一個(gè)控件:
SurfaceView
,然后在getSurfaceView()
中返回這個(gè)SurfaceView對(duì)
象 - 自定義掃描界面中涉及選擇相冊(cè)中二維碼照片掃描功能的時(shí)候,若用戶不授權(quán)相冊(cè)權(quán)限浑玛,需要在拒絕授權(quán)的方法中調(diào)用
noAlbumPermission()
方法绍申, 然后在noAlbumPermission()
方法中做無(wú)相冊(cè)權(quán)限的處理 - 在自定義掃描界面中,無(wú)需調(diào)用
onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
方法處理相冊(cè)數(shù)據(jù)回傳問(wèn)題顾彰, 因?yàn)樵?code>BaseCaptureActivity中已做處理,開(kāi)發(fā)者只需當(dāng)getContentArray()
方法中第二個(gè)參數(shù)為false
(即掃描結(jié)果在掃描界面處理)的時(shí)候极阅,在scanSuccess(String result,int width,int height)
和scanFailed(String result,int width,int height)
中做好掃描成功和掃描失敗 的邏輯處理即可。
在自定義掃描界面中也可能會(huì)使用到BaseCaptureActivity
中的以下幾個(gè)方法:
/***
* 掃描動(dòng)畫(huà)
*
* @param view 掃描線的imageView
* @param duration 掃描時(shí)間間隔涨享,單位毫秒筋搏,若duration<=0,則取默認(rèn)時(shí)間間隔2500毫秒
*/
public void scanAnimation(View view,int duration)
/**打開(kāi)相冊(cè)**/
public void selectImage()
/**開(kāi)啟/關(guān)閉閃光燈**/
public void changeFlashLight()
5.2 自定義掃描界面
自定義掃描界面需要繼承BaseCaptureActivity
,以自定義掃描界面CustScanActivity
為例,你可以像下面這樣開(kāi)始你的自定義掃描界面:
/**
* Title:自定義掃描界面
* description:
* autor:pei
* created on 2020/3/28
*/
public class CustScanActivity extends BaseCaptureActivity {
@Override
protected Object[] getContentArray() {
//參數(shù)1:布局文件id厕隧,如 R.layout.activity_cus_scan
//參數(shù)2:掃描完畢后奔脐,是否立刻關(guān)閉掃描界面。true:是吁讨,false:否髓迎。
//例如:return new Object[]{R.layout.activity_cus_scan,true};
return new Object[]{1,true};
}
@Override
protected void initView() {
//初始化控件
}
@Override
protected SurfaceView getSurfaceView() {
return null;//返回SurfaceView對(duì)象,必須返回,不能為null
}
@Override
protected void initData() {
super.initData();
//當(dāng)你自定義掃描界面的時(shí)候建丧,你可能需要使用到這個(gè)掃描動(dòng)畫(huà)的方法,具體使用可參考CaptureActivity類
// //掃描動(dòng)畫(huà)
// scanAnimation(mImvScan,0);
}
@Override
protected void initCrop() {
//在此設(shè)置掃描二維碼的尺寸排龄,如:
// super.mCropRect=new Rect();
// mCropRect.set(0,0,200,200);
//不過(guò)一般我們都直接調(diào)用父類默認(rèn)測(cè)量代碼,
//參考CaptureActivity中super.defaultInitCrop(mPreLayout,mScanLayout);
}
@Override
protected void setListener() {
}
@Override
protected void noAlbumPermission() {
//未給定打開(kāi)相冊(cè)權(quán)限的處理
}
@Override
public void onClick(View v) {
}
@Override
protected void scanSuccess(String result, int width, int height) {
//掃描成功的處理
}
@Override
protected void scanFailed(String result, int width, int height) {
//掃描失敗的處理
}
}
假如你項(xiàng)目中界面A
需要集成定義掃描界面CustScanActivity
.那么你需要如下幾步處理:
- 你需要在你項(xiàng)目的
Androidmanifast.xml
中注冊(cè)CustScanActivity
以用于界面跳轉(zhuǎn)翎朱。 - 在
界面A
中點(diǎn)擊按鈕時(shí)處理打開(kāi)相機(jī)
,相冊(cè)讀寫(xiě)權(quán)限
等橄维。涉及要修改的地方有Androidmanifast.xml
,fileprovider
以及android6.0+用戶手動(dòng)權(quán)限
這里就不詳細(xì)說(shuō)明了尺铣。 - 然后在具備權(quán)限的情況下,你可以在
界面A
通過(guò)以下方法跳轉(zhuǎn)到自定義掃描界面CustScanActivity
:
//跳轉(zhuǎn)掃描界面
BaseCaptureActivity.startAct(Context context,Class<?>cls);
- 在自定義掃描界面
CustScanActivity
中實(shí)現(xiàn)getContentArray()
方法争舞,類似如下:
@Override
protected Object[] getContentArray() {
//參數(shù)1:布局文件id凛忿,如 R.layout.activity_cus_scan
//參數(shù)2:掃描完畢后,是否立刻關(guān)閉掃描界面竞川。true:是店溢,false:否。
return new Object[]{R.layout.activity_cus_scan,true};
}
- 當(dāng)?shù)诙€(gè)參數(shù)為
true
時(shí)流译,表示掃描出結(jié)果后會(huì)立馬關(guān)閉當(dāng)前掃描界面逞怨,那么掃描結(jié)果會(huì)在界面A
中處理,若是此種情況福澡, 你無(wú)需在CustScanActivity
界面的scanSuccess(String result, int width, int height)
和scanFailed(String result, int width, int height)
中做任何邏輯處理。你需要在界面A
中處理掃描返回結(jié)果驹马。在界面A
的onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
中做掃描結(jié)果的處理革砸,你可以像下面這樣:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
BaseCaptureActivity.getCodeResult(requestCode, data, new OnScanResultListener() {
@Override
public void scanSuccess(String result, int width, int height) {
//掃描結(jié)果成功的處理
//....
}
@Override
public void scanFailed(String result, int width, int height) {
//掃描結(jié)果失敗的處理
//....
}
});
}
- 當(dāng)?shù)诙€(gè)參數(shù)為
false
時(shí),表示掃描出結(jié)果后糯累,不關(guān)閉掃描界面算利。這時(shí)你的掃描結(jié)果是在自定義掃描界面CustScanActivity
中處理,而不是在界面A
中處理泳姐。所以你要在自定義掃描界面CustScanActivity
的scanSuccess(String result, int width, int height)
和scanFailed(String result, int width, int height)
中做掃描成功和掃描失敗的處理效拭,類似如下:
@Override
protected void scanSuccess(String result, int width, int height) {
//掃描成功的處理
//...
}
@Override
protected void scanFailed(String result, int width, int height) {
//掃描失敗的處理
//...
}
- 自定義掃描界面
CustScanActivity
其他幾個(gè)方法的解釋
- initView()`:用于處理控件初始化
-
getSurfaceView()
:返回SurfaceView
對(duì)象,必須返回,不能為null
胖秒。即你在自定義掃描界面CustScanActivity
中必須有一個(gè)SurfaceView
控件 在initView()
初始化后缎患,在此方法中返回SurfaceView
對(duì)象 -
initData()
:可在此方法中做初始化時(shí)數(shù)據(jù)的解基本處理,例如在定制界面CaptureActivity
中此處做的是掃描動(dòng)畫(huà)處理 -
initCrop()
:用于處理獲取掃描的二維碼的尺寸邏輯阎肝,不寫(xiě)此方法的邏輯時(shí)挤渔,默認(rèn)獲取二維碼尺寸為0
-
setListener()
:設(shè)置控件監(jiān)聽(tīng) -
onClick(View v)
:實(shí)現(xiàn)點(diǎn)擊按鍵處理邏輯 -
noAlbumPermission()
:用戶拒絕權(quán)限的方法中調(diào)用此方法。并在此方法中處理用戶拒絕授權(quán)的邏輯 -
scanSuccess(String result, int width, int height)
和scanFailed(String result, int width, int height)
:當(dāng)掃描界面在getContentArray()
方法中第二個(gè)參數(shù)設(shè)置為false
(即掃描結(jié)果的處理在掃描界面處理的時(shí)候)风题,用于做掃描結(jié)果成功或失敗的處理
六.一維碼/二維碼生成
一維碼/二維碼
生成主要用到工具類EncodingUtils
判导,下面列出EncodingUtils
幾個(gè)主要方法:
/**
* 創(chuàng)建黑色二維碼
*
* @param content content
* @param widthPix widthPix
* @param heightPix heightPix
* @param logoBm logoBm
* @return 二維碼
*/
public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)
/**
* 生成單色二維碼
* @param content 二維碼內(nèi)容
* @param widthPix 二維碼尺寸(寬度)
* @param color 二維碼顏色,格式為: 0xff000000 或 Color.RED
* @param heightPix 二維碼尺寸(高度)
* @param logoBm 二維碼logo,為null時(shí)表示二維碼中無(wú)圖片
* @return
*/
public static Bitmap createPureColorQRCode(String content, int widthPix, int heightPix, int color,Bitmap logoBm)
/**
* 生成一維碼
*
* @param content 文本內(nèi)容
* @param qrWidth 條形碼的寬度
* @param qrHeight 條形碼的高度
* @param hasText 一維碼底部是否顯示文字沛硅。true:顯示眼刃,false:不顯示
* @return bitmap
*/
public static Bitmap createBarCode(String content, int qrWidth, int qrHeight,boolean hasText)
七.掃描及一維碼/二維碼生成在MainActivity中的使用
下main貼出在MainActivity
中使用代碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mTextView;
private TextView mTextView1;
//聲明
private ImageView mImv;
private Button mButton1;
private Button mButton2;
private Button mButton3;
private Button mButton4;
private static final int PERMISSION_CODE=1234;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView1=findViewById(R.id.tv1);
//初始化
mImv=findViewById(R.id.imv);
mButton1=findViewById(R.id.btn1);
mButton2=findViewById(R.id.btn2);
mButton3=findViewById(R.id.btn3);
mButton4=findViewById(R.id.btn4);
//設(shè)置監(jiān)聽(tīng)
setListener();
//申請(qǐng)權(quán)限
requestPermission(MainActivity.PERMISSION_CODE);
}
private void requestPermission(int requestCode) {
String permissions[] = {
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE};
PermissionHelper.getInstance().checkPermissions(permissions, requestCode, MainActivity.this);
}
@PermissionSuccess(requestCode = MainActivity.PERMISSION_CODE)
public void requestSuccess() {
//申請(qǐng)到權(quán)限后的處理
//......
LogUtil.i("=====權(quán)限申請(qǐng)成功======");
}
@PermissionFail(requestCode = MainActivity.PERMISSION_CODE)
public void requestFail() {
//未獲取到權(quán)限的處理
//......
LogUtil.i("=====權(quán)限申請(qǐng)失敗======");
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
PermissionHelper.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void setListener(){
mButton1.setOnClickListener(this);
mButton2.setOnClickListener(this);
mButton3.setOnClickListener(this);
mButton4.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String input="http://weixin.qq.com/r/k0MlPaDEaf0WreRe9xaB";
switch (v.getId()) {
case R.id.btn1://掃描
BaseCaptureActivity.startAct(this,ScanActivity.class);
break;
case R.id.btn2://生成條形碼
//生成底部文字的條形碼
Bitmap bitmap1= EncodingUtils.createBarCode("ben pao de pain", ScreenUtil.dp2px(250,this), ScreenUtil.dp2px(100,this),true);
mImv.setImageBitmap(bitmap1);
break;
case R.id.btn3://生成黑色帶logo的二維碼
Bitmap bitmaoLogo= BitmapFactory.decodeResource(getResources(),R.mipmap.ic_pain);
Bitmap bitmap2=EncodingUtils.createQRCode(input, ScreenUtil.dp2px(250,this),ScreenUtil.dp2px(250,this),bitmaoLogo);
mImv.setImageBitmap(bitmap2);
break;
case R.id.btn4://生成單色二維碼
Bitmap bitmap3=EncodingUtils.createPureColorQRCode(input, ScreenUtil.dp2px(250,this),ScreenUtil.dp2px(250,this), 0xff0c9f11,null);
mImv.setImageBitmap(bitmap3);
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
}
八.效果圖和項(xiàng)目結(jié)構(gòu)圖
ok,今天的內(nèi)容就將到這里了摇肌,謝謝大家擂红。