本文概述
- 1.添加并安装QReader作为gradle的依赖项
- 2.注册助手权限类
- 3.创建布局
- 4.活动实施
在本文中, 我们将向你展示如何安装和使用QReader库来读取Android应用程序中的QR代码。
1.添加并安装QReader作为gradle的依赖项 第一步, 要开始使用QReader库, 你需要安装它。通过gradle管理可以轻松完成此操作。如果你使用的是Gradle> 4.0, 则通过以下方式添加依赖项:
dependencies {implementation 'com.github.nisrulz:qreader:2.1.1'}
如果你使用的是Gradle < 4.0, 则按如下所示添加它:
dependencies {compile 'com.github.nisrulz:qreader:2.1.1'}
到本文日期为止, 最新的可用版本可能更高, 因此请确保在存储库的发行页面上检查可用的最新版本。添加依赖项后, 请同步项目, 以便将库安装。有关此库的更多信息, 请访问Github上的官方存储库。
2.注册助手权限类 在你的项目中创建一个新的Java类, 即RuntimePermissionUtil.java。该文件将包含以下代码:
// \app\src\main\java\com\yourcompany\yourapp\RuntimePermissionUtil.javapackage com.yourcompany.yourapp;
/* * Copyright (C) 2016 Nishant Srivastava * * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
public class RuntimePermissionUtil {private RuntimePermissionUtil() {}public static void onRequestPermissionsResult(int[] grantResults, RPResultListener rpResultListener) {if (grantResults.length >
0) {for (int grantResult : grantResults) {if (grantResult == PackageManager.PERMISSION_GRANTED) {rpResultListener.onPermissionGranted();
} else {rpResultListener.onPermissionDenied();
}}}}public static void requestPermission(final Activity activity, final String[] permissions, final int REQUEST_CODE) {// No explanation needed, we can request the permission.ActivityCompat.requestPermissions(activity, permissions, REQUEST_CODE);
}public static void requestPermission(final Activity activity, final String permission, final int REQUEST_CODE) {// No explanation needed, we can request the permission.ActivityCompat.requestPermissions(activity, new String[] { permission }, REQUEST_CODE);
}public static boolean checkPermissonGranted(Context context, String permission) {return (ActivityCompat.checkSelfPermission(context, permission)==PackageManager.PERMISSION_GRANTED);
}}
【如何使用QReader库在Android中创建QR码阅读器】稍后将在我们的实现代码中使用此类, 以动态地处理相机权限, 就像新的Android平台一样。你还将需要创建一个包含以下内容的接口文件:
// \app\src\main\java\com\yourcompany\yourapp\RPResultListener.javapackage com.yourcompany.yourapp;
interface RPResultListener {void onPermissionGranted();
void onPermissionDenied();
}
完成此步骤后, 你将拥有2个额外的Java文件, 我们将在下一步的实现中使用它们。
3.创建布局 布局需要根据你的需求非常独立, 但是, 我们将使用一种非常基本的方法, 其中将包含2个按钮, 一个用于处理阅读器状态(启用/禁用)的按钮, 以及用于重新启动当前活动的按钮。我们将对上述元素使用线性布局, 并将其放置在主活动中。由于我们的应用仅包含此内容, 因此你可以为活动创建另一种布局, 以防你想在另一种布局中创建它:
<
?xml version="1.0" encoding="utf-8"?>
<
android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity">
<
LinearLayoutandroid:id="@+id/info"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:orientation="vertical">
<
TextViewandroid:id="@+id/code_info"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:padding="10dp"android:textColor="@android:color/black"android:textSize="20sp"/>
<
Buttonandroid:id="@+id/btn_start_stop"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Start/Stop reader"/>
<
Buttonandroid:id="@+id/btn_restart_activity"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="Restart activity"/>
<
SurfaceViewandroid:id="@+id/camera_view"android:layout_width="match_parent"android:layout_height="400dp"android:layout_marginTop="20dp"android:layout_above="@+id/info"/>
<
/LinearLayout>
<
/android.support.constraint.ConstraintLayout>
此布局将具有以下预览:
文章图片
4.活动实施 最后, 我们需要编写代码来处理你的活动中的逻辑。如前所述, 我们正在一个只有一个活动的空项目中工作, 因此我们将在应用程序的主活动上处理代码, 但是你可以根据需要在另一个活动上实现代码。首先, 我们需要包括将要使用的类的名称空间。还创建类级别的变量, 这些变量将包含例如读取器实例, 将在其中显示相机图像的表面视图。
该逻辑仅基于首先请求摄影机许可(如果已获得许可), 则应使用初始化QReader基本实例的setupQREader方法启动阅读器。当读者检测到并解释QRCode时, 其内容将显示在我们布局的信息标签中:
// \app\src\main\java\com\yourcompany\yourapp\MainActivity.javapackage com.yourcompany.yourapp;
import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import android.widget.Button;
import android.view.View;
import android.view.SurfaceView;
import github.nisrulz.qreader.QRDataListener;
import github.nisrulz.qreader.QREader;
public class MainActivity extends AppCompatActivity {// User Interfaceprivate TextView text;
// QREaderprivate SurfaceView mySurfaceView;
private QREader qrEader;
private boolean hasCameraPermission = false;
private static final String cameraPerm = Manifest.permission.CAMERA;
@Overrideprotected void onCreate(final Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1. When the app starts, request Camera permissionhasCameraPermission = RuntimePermissionUtil.checkPermissonGranted(this, cameraPerm);
text = findViewById(R.id.code_info);
// 2. Handle action button text. With this button you will start/stop the readerfinal Button stateBtn = findViewById(R.id.btn_start_stop);
// change of reader state in dynamicstateBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (qrEader.isCameraRunning()) {stateBtn.setText("Start QREader");
qrEader.stop();
} else {stateBtn.setText("Stop QREader");
qrEader.start();
}}});
stateBtn.setVisibility(View.VISIBLE);
Button restartButton = findViewById(R.id.btn_restart_activity);
restartButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {restartActivity();
}});
// Setup SurfaceView// -----------------mySurfaceView = findViewById(R.id.camera_view);
if (hasCameraPermission) {// Setup QREadersetupQREader();
} else {RuntimePermissionUtil.requestPermission(MainActivity.this, cameraPerm, 100);
}}void restartActivity() {startActivity(new Intent(MainActivity.this, MainActivity.class));
finish();
}void setupQREader() {// Init QREader// ------------qrEader = new QREader.Builder(this, mySurfaceView, new QRDataListener() {@Overridepublic void onDetected(final String data) {Log.d("QREader", "Value : " + data);
text.post(new Runnable() {@Overridepublic void run() {text.setText(data);
}});
}}).facing(QREader.BACK_CAM).enableAutofocus(true).height(mySurfaceView.getHeight()).width(mySurfaceView.getWidth()).build();
}@Overrideprotected void onPause() {super.onPause();
if (hasCameraPermission) {// Cleanup in onPause()// --------------------qrEader.releaseAndCleanup();
}}@Overrideprotected void onResume() {super.onResume();
if (hasCameraPermission) {// Init and Start with SurfaceView// -------------------------------qrEader.initAndStart(mySurfaceView);
}}// Method that handles the result of the permission request made at the beginning of the application@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) {if (requestCode == 100) {RuntimePermissionUtil.onRequestPermissionsResult(grantResults, new RPResultListener() {@Overridepublic void onPermissionGranted() {if ( RuntimePermissionUtil.checkPermissonGranted(MainActivity.this, cameraPerm)) {restartActivity();
}}@Overridepublic void onPermissionDenied() {// Do nothing}});
}}}
编码愉快!
推荐阅读
- 为什么要学习Python编程语言()
- 为什么Python是编程的未来()
- 如何在Python中使用PySftp访问SFTP服务器
- python基础篇(二十)——Python中的一些易混淆点总结(完结)
- 技术实践丨体验量子神经网络在自然语言处理中的应用
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
- #导入MD文档图片#超好玩的Python3工具--利用OpenCV视频转字符动画
- 20210611 word2vec 理论介绍
- Python爬虫 | 爬取b站北京奥运会开幕式弹幕,有多少人从东京奥运会跑过来的()