
2017-3-7
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請說明出處。
app中需要實現(xiàn)掃碼功能
最近在做一個app,之前做過掃描二維碼的功能。然而今天突然想要做這樣一個功能時,完全想不起來當時是怎么實現(xiàn)的。我翻看自己的筆記本,發(fā)現(xiàn)太多了各種筆記了,沒找到,我不知道是在其他的筆記本還是我壓根沒記。這時我意識到寫博客對一個程序員的重要性,以后還是要養(yǎng)成寫博客的習慣才好。
1.加載二維碼開源包
compile 'cn.yipianfengye.android:zxing-library:2.0'
compile 'com.google.zxing:core:3.2.1'
2.在activity
ZXingLibrary.initDisplayOpinion(this);
btn_start_scan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (preferences.getBoolean("firstStart", true))
{
L.i(LOGTAG, "掃碼");
editor = preferences.edit();
editor.putBoolean("firstStart", false);
editor.apply();
Intent intent1 = new Intent(StartActivity.this, CaptureActivity.class);
startActivityForResult(intent1, REQUEST_CODE);
}
else
{
L.i(LOGTAG, "主頁");
Intent intent = new Intent(StartActivity.this,MainPageActivity.class);
startActivity(intent);
finish();
}
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, final Intent data)
{
/** * 處理二維碼掃描結(jié)果 */
if (requestCode == REQUEST_CODE)
{
//處理掃描結(jié)果(在界面上顯示)
if (null != data)
{
Bundle bundle = data.getExtras();
if (bundle == null)
{
return;
}
if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS)
{
result = bundle.getString(CodeUtils.RESULT_STRING);
L.i("掃描結(jié)果:",result);
}
else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED)
{
Toast.makeText(getApplicationContext(), "解析二維碼失敗", Toast.LENGTH_SHORT).show();
}
}
}
}
3.添加調(diào)用攝像頭的權(quán)限
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
4.做完以上三步,運行,打開手機的設(shè)置權(quán)限,允許使用攝像頭,成功掃描二維碼。
5.我們來看看二維碼的原理
//二維碼算法
//兩個for循環(huán)是圖片橫列掃描的結(jié)果
for(int y=0;y<QR_HEIGHT;y++)
{
for(int x;x<QR_WIDTH;x++)
{
if(bitMatri.get(x,y))
{
pixels[y*QR_WIDTH+x]=oxff000000;
}
else
{
pixels[y*QR_WIDTH+x]=oxffffffff;
}
}
}
6.后續(xù)
最近又有一個項目是需要用到掃描二維碼的功能了,原本想著自己以前用過, command + c , 五分鐘之后就應該可以實現(xiàn)的功能,結(jié)果發(fā)現(xiàn)這代碼早過時了~
更新一下新用法:
- build.gradle 添加依賴
dependencies {
implementation 'com.journeyapps:zxing-android-embedded:3.0.2@aar'
implementation 'com.google.zxing:core:3.2.0'
}
- AndroidManifest.xml 添加權(quán)限
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
- Activity 中調(diào)用
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
@BindView(R.id.btn_scan)
Button btn_scan;
@BindView(R.id.tv_text)
TextView tv_text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
btn_scan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new com.google.zxing.integration.android.IntentIntegrator(MainActivity.this).initiateScan();
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, final Intent data) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (result != null) {
if (result.getContents() == null) {
Log.d("MainActivity", "Cancelled scan");
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
Log.d("MainActivity", "Scanned");
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
}
} else {
// This is important, otherwise the result will not be passed to the fragment
super.onActivityResult(requestCode, resultCode, data);
}
}
}
-
在 草料二維碼生成測試二維碼,掃描結(jié)果:
2020-8-7
