您的位置:首页 > 移动开发 > Android开发

Android 利用Zxing实现扫描二维码并跳转详情页面

2017-12-18 20:33 671 查看

一言不合就上图







因为是第三方集成好的所以|||

老套路首先注入依赖:

//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.+'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐