一言不合就上图
因为是第三方集成好的所以|||
老套路首先注入依赖:
//zxing二维码
compile 'cn.yipianfengye.android:zxing-library:2.1'
Manifest注册清单里面添加打开相机的权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
然后是activity_main.xml布局文件,随便给个控件,为了触发点击事件(点击打开相机):
<TextView
android:id="@+id/tvSys"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点我扫一扫"
android:textSize="22sp"/>
然后新建一个zxing_webview_layout.xml布局文件,用来跳转显示二维码的详情:
<EditText
android:id="@+id/receptionTv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp" />
<WebView
android:id="@+id/wb"
android:layout_width="match_parent"
android:layout_height="match_parent"></WebView>
然后一个重点 需要新建一个类继承application,初始化zxing包:
public class ZXingApplication extends Application {
//oncreate方法
@Override
public void onCreate() {
super.onCreate();
//初始化ZXING包
ZXingLibrary.initDisplayOpinion(this);
}
}
千万不要忘记在ManiFast注册清单里面声明一下application类:
<application
android:name=".ZXingApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//这是跳转到详情页面也别忘记,声明此类
<activity android:name=".ZXingActivity" />
</application>
然后就是MainActivity的代码:
public class MainActivity extends AppCompatActivity {
//定义一个全局的静态常量
private static final int REQUEST_CODE = 001;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//运动时权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
//申请WRITE_EXTERNAL_STORAGE权限
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
}
//找控件
TextView tvSys = (TextView) findViewById(R.id.tvSys);
//点击事件
tvSys.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//调用系统相机功能,就是跳转到摄像头的界面
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
//用此方法跳转的原因是:为了回调下面onActivityResult的方法
startActivityForResult(intent, REQUEST_CODE);
}
});
}
//扫描回传值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE) {
Bundle bundle = data.getExtras();
if (bundle == null) {
return;
}
if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
//这是拿到解析扫描到的信息,并转成字符串
String result = bundle.getString(CodeUtils.RESULT_STRING);
Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
//解析扫到的二维码后就跳转页面
Intent intent = new Intent(MainActivity.this, ZXingActivity.class);
//把扫到并解析到的信息(既:字符串)带到详情页面
intent.putExtra("path", result);
startActivity(intent);
} else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
//否则土司解析二维码失败
Toast.makeText(this, "解析二维码失败:", Toast.LENGTH_LONG).show();
}
}
}
}
然后就是跳转详情的页面也就是ZXingActivity类:
public class ZXingActivity extends Activity {
//控件设了个全局
private WebView wb;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.zxing_webview_layout);
//找控件
wb = findViewById(R.id.wb);
TextView receptionTv = findViewById(R.id.receptionTv);
//支持js语言
wb.getSettings().setJavaScriptEnabled(true);
// 缩放至屏幕的大小
wb.getSettings().setLoadWithOverviewMode(true);
//支持缩放
wb.getSettings().setSupportZoom(true);
//声明一个Intent意图,用来接受MainActivity传过来的值
Intent intent = getIntent();
//拿到MainActivity传过来的值并返回一个字符串,
//口令要一致
String jxString = intent.getStringExtra("path");
//把字符串赋值给输入框
receptionTv.setText(jxString);
//webVew去加载网页
wb.loadUrl(jxString);
//设置用自己的浏览器打开
wb.setWebViewClient(new MyWebViewClient());
//设置它的进度
/*wb.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
//拿到当前进度的int值
}
});
}*/
//是否允许返回
/* @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && wb.canGoBack()) {
//让webView返回上一级
wb.goBack();
}
return true;
}*/
//自定义浏览器
class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
}
//预防内存泄露
@Override
protected void onPause() {
super.onPause();
finish();
}
}
完事儿
强调几点:
1我的Android studio是2.3.3版本,SDK下-v7:26.+’
compile 'com.android.support:appcompat-v7:26.+'
本文介绍了如何在Android应用中使用Zxing库实现二维码扫描,并在扫描成功后跳转到详情页面。首先在Manifest中添加相机权限,接着在布局文件中设置触发相机的点击事件。创建ZXingWebview布局文件用于展示二维码详情。自定义Application类初始化Zxing包,并在MainActivity和ZXingActivity中处理扫描和跳转逻辑。
1万+





