我是靠谱客的博主 负责鞋子,最近开发中收集的这篇文章主要介绍Android开发中的二维码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 二维码的制作

  • 关于二维码的制作,推荐草料二维码:http://cli.im/

2. 二维码的组成

  • 二维码是由黑白小点和左上左下右上三个正方形组成。

  • 黑白小点:黑点代表二进制里面的1,白点代表而进行里面的0。

  • 正方形:限定了二维码的范围,扫描的时候必须把三个正方形放在扫描区域内。

  • 二维码越密集,表示信息量越大,二维码越稀疏,表示信息量较少。

  • 注意:二维码允许20%左右的区域被遮挡,此时根据算法依然可以扫描出正确内容。

3. 利用二维码第三方库ZXING进行Android开发

3.1 第三方jar包下载地址:

链接:http://pan.baidu.com/s/1c1WKN5m 密码:qjil

3.2 进行开发

3.2.1(以下步骤顺序不要变,否则可能会出错)

1. 创建一个名为QR_code的项目,修改MainActivity和activity_main.xml:

MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initClick();
}
private void initClick() {
bt.setOnClickListener(this);
}
private void initView() {
bt = (Button) findViewById(R.id.bt_scan);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.bt_scan:
break;
}
}
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.fkq.qr_code.MainActivity">
<Button

android:id="@+id/bt_scan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Scan"
android:textSize="30sp" />
</RelativeLayout>

说明:创建一个Button的点击事件。

2. File-New-Import-Module,导入ZXINGCODELIBS项目。

3. 修改ZXINGCODELIBS项目的bulid.gradle,以下地方形式代码如下:

修改之后的apply:
apply plugin: 'com.android.library'
删除了一行信息并且把依赖库的最低兼容版本和目标SDK版本修改为和主项目一致:
defaultConfig {
minSdkVersion 16
targetSdkVersion 25
}
数字部分和主项目一致
compileSdkVersion 25
buildToolsVersion "25.0.1"

4. 添加依赖库(File-Project Structure-Dependencies)

5. 修改主项目配置文件(如果不报manifest错误就忽视这一步骤):

  • manifest根标签内添加:
xmlns:tools="http://schemas.android.com/tools"
  • application标签上添加:
 tools:replace="Android:icon, android:theme"
  • 我的项目配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.fkq.qr_code">
<application

android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:replace="Android:icon, android:theme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

6. 同步Sync。

7. 删除依赖库ZXINGCODELIBS配置文件下的表示主程序的代码:

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

8. 这个时候修改MainActivity和CaptureActivity里面的代码,添加按钮点击事件,跳转到CaptureActivity,也就是摄像头的页面,并且返回数据给页面,并对返回回来的数据做处理,并加入了运行时权限,测试手机为vivo x9i ,好像运行时权限不是特别管用,真机不像模拟器一样对运行时权限敏感,可能是私人定制的问题,大家如果对这部分有想法可以留言给我

MainActivity:

/**
* 处理点击事件
*
* @param view
*/
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.bt_scan:
//
跳转页面需要返回一个结果
Intent intent = new Intent(this, CaptureActivity.class);
startActivityForResult(intent, 1);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
//获取解析的数据
text = data.getStringExtra("text");
Log.e(TAG, "text:" + text);
handleResult(text);
}
}

CaptureActivity:

public void handleDecode(Result rawResult, Bitmap barcode) {
inactivityTimer.onActivity();
//
ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(
//
this, rawResult);
boolean fromLiveScan = barcode != null;
if (fromLiveScan) {
// Then not from history, so beep/vibrate and we have an image to
// draw on
beepManager.playBeepSoundAndVibrate();
// drawResultPoints(barcode, rawResult);
viewfinderView.drawResultBitmap(barcode);
}
String text = rawResult.getText();
Log.d(TAG, "result:::" + text);
//讲扫描的结果返回给入口Activity
Intent data = new Intent();
data.putExtra("text",text);
setResult(RESULT_OK,data);
finish();
}

handleResult()方法:

 /**
* 处理扫描结果
*/
private void handleResult(String text) {
//网址:http://或者是https://
//电话:tel:110
//信息:smsto:12589654123
//邮件:mailto:xx@163.com
//应用市场:market://
//普通字符串:
if (TextUtils.isEmpty(text)) {
return;
}
if (text.startsWith("http://") || text.startsWith("https://")) {
jumpToweb();
} else if (text.startsWith("tel:")) {
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
} else {
jumpTocall();
}
} else if (text.startsWith("smsto:")) {
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 2);
} else {
jumpTosms();
}
} else if (text.startsWith("mailto:")) {
if (ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 3);
} else {
jumpTomail();
}
} else if (text.startsWith("market://")) {
jumpTomarket();
} else {
//用弹窗展示信息,如果信息扫描不符合以上规范
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("扫描结果:");//标题
builder.setMessage(text);//内容
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(getApplicationContext(), "确定", Toast.LENGTH_SHORT).show();
}
});
builder.show();
}
}
/**
* 跳转到应用市场
*/
private void jumpTomarket() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(text));
startActivity(intent);
}
/**
* 发邮件(同样是SENDTO)
*/
private void jumpTomail() {
try {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse(text));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
/**
* 跳转到发信息
*/
private void jumpTosms() {
try {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse(text));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
/**
* 跳转到打电话
*/
private void jumpTocall() {
try {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(text));
startActivity(intent);
} catch (SecurityException e) {
e.printStackTrace();
}
}
/**
* 跳转浏览器记载网页
*/
private void jumpToweb() {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(text));
startActivity(intent);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
jumpTocall();
} else {
Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show();
}
break;
case 2:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
jumpTosms();
} else {
Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show();
}
break;
case 3:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
jumpTomail();
} else {
Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}

最后

以上就是负责鞋子为你收集整理的Android开发中的二维码的全部内容,希望文章能够帮你解决Android开发中的二维码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部