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

Android开发中的二维码

2017-05-06 13:35 155 查看

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:
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息