1、支持条形码下方显示Code。

2、优化扫条形码。
3、优化相机预览尺寸遍历策略、从而降低变形的可能性。
This commit is contained in:
jenly1314
2018-09-12 17:07:51 +08:00
parent cdb116200f
commit 06694d28a0
20 changed files with 463 additions and 49 deletions

Binary file not shown.

View File

@@ -2,6 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.king.zxing.app">
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"

View File

@@ -47,7 +47,7 @@ public class CodeActivity extends AppCompatActivity {
if(isQRCode){
createQRCode(getString(R.string.app_name));
}else{
createBarCode(getString(R.string.app_name));
createBarCode("1234567890");
}
}
@@ -69,7 +69,7 @@ public class CodeActivity extends AppCompatActivity {
*/
private void createBarCode(String content){
//生成条形码最好放子线程生成防止阻塞UI这里只是演示
Bitmap bitmap = CodeUtils.createBarCode(content, BarcodeFormat.CODE_128,800,200);
Bitmap bitmap = CodeUtils.createBarCode(content, BarcodeFormat.CODE_128,800,200,null,true);
//显示条形码
ivCode.setImageBitmap(bitmap);
}

View File

@@ -16,16 +16,26 @@
package com.king.zxing.app;
import android.Manifest;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.provider.MediaStore;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.zxing.DecodeHintType;
import com.google.zxing.common.StringUtils;
import com.king.zxing.CaptureActivity;
import com.king.zxing.Intents;
import com.king.zxing.app.util.UriUtils;
import com.king.zxing.util.CodeUtils;
import java.util.List;
@@ -37,10 +47,13 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P
public static final String KEY_TITLE = "key_title";
public static final String KEY_IS_QR_CODE = "key_code";
public static final int REQUEST_CODE = 0X01;
public static final int REQUEST_CODE_SCAN = 0X01;
public static final int REQUEST_CODE_PHOTO = 0X02;
public static final int RC_CAMERA = 0X01;
public static final int RC_READ_PHOTO = 0X02;
private Class<?> cls;
private String title;
@@ -53,15 +66,48 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
if(data!=null){
//识别结果
String result = data.getStringExtra(Intents.Scan.RESULT);
Toast.makeText(this,result,Toast.LENGTH_SHORT).show();
if(resultCode == RESULT_OK && data!=null){
switch (requestCode){
case REQUEST_CODE_SCAN:
String result = data.getStringExtra(Intents.Scan.RESULT);
Toast.makeText(this,result,Toast.LENGTH_SHORT).show();
break;
case REQUEST_CODE_PHOTO:
parsePhoto(data);
break;
}
}
}
private void parsePhoto(Intent data){
final String path = UriUtils.INSTANCE.getImagePath(this,data);
Log.d("Jenly","path:" + path);
if(TextUtils.isEmpty(path)){
return;
}
//异步解析
asyncThread(new Runnable() {
@Override
public void run() {
final String result = CodeUtils.parseCode(path);
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("Jenly","result:" + result);
Toast.makeText(getContext(),result,Toast.LENGTH_SHORT).show();
}
});
}
});
}
private Context getContext(){
return this;
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
@@ -73,7 +119,12 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P
@Override
public void onPermissionsGranted(int requestCode, List<String> list) {
// Some permissions have been granted
startScan(cls,title);
switch (requestCode){
case RC_CAMERA:
startScan(cls,title);
break;
}
}
@Override
@@ -101,6 +152,10 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P
}
}
private void asyncThread(Runnable runnable){
new Thread(runnable).start();
}
/**
* 扫码
* @param cls
@@ -110,7 +165,7 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P
ActivityOptionsCompat optionsCompat = ActivityOptionsCompat.makeCustomAnimation(this,R.anim.in,R.anim.out);
Intent intent = new Intent(this, cls);
intent.putExtra(KEY_TITLE,title);
ActivityCompat.startActivityForResult(this,intent,REQUEST_CODE,optionsCompat.toBundle());
ActivityCompat.startActivityForResult(this,intent,REQUEST_CODE_SCAN,optionsCompat.toBundle());
}
/**
@@ -124,6 +179,24 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P
startActivity(intent);
}
private void startPhotoCode(){
Intent pickIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(pickIntent, REQUEST_CODE_PHOTO);
}
@AfterPermissionGranted(RC_READ_PHOTO)
private void checkExternalStoragePermissions(){
String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (EasyPermissions.hasPermissions(this, perms)) {//有权限
startPhotoCode();
}else{
EasyPermissions.requestPermissions(this, getString(R.string.permission_external_storage),
RC_READ_PHOTO, perms);
}
}
public void OnClick(View v){
switch (v.getId()){
case R.id.btn1:
@@ -141,6 +214,9 @@ public class MainActivity extends AppCompatActivity implements EasyPermissions.P
case R.id.btn5:
startCode(true);
break;
case R.id.btn6:
checkExternalStoragePermissions();
break;
}
}

View File

@@ -0,0 +1,69 @@
package com.king.zxing.app.util;
import android.annotation.TargetApi;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;
/**
* @author Jenly <a href="mailto:jenly1314@gmail.com">Jenly</a>
*/
public enum UriUtils {
INSTANCE;
/**
* 获取图片
*/
public String getImagePath(Context context,Intent data) {
String imagePath = null;
Uri uri = data.getData();
//获取系統版本
int currentapiVersion = Build.VERSION.SDK_INT;
if(currentapiVersion> Build.VERSION_CODES.KITKAT){
Log.d("uri=intent.getData :", "" + uri);
if (DocumentsContract.isDocumentUri(context, uri)) {
String docId = DocumentsContract.getDocumentId(uri);
Log.d("getDocumentId(uri) :", "" + docId);
Log.d("uri.getAuthority() :", "" + uri.getAuthority());
if ("com.android.providers.media.documents".equals(uri.getAuthority())) {
String id = docId.split(":")[1];
String selection = MediaStore.Images.Media._ID + "=" + id;
imagePath = getImagePath(context,MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection);
} else if ("com.android.providers.downloads.documents".equals(uri.getAuthority())) {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
imagePath = getImagePath(context,contentUri, null);
}
} else if ("content".equalsIgnoreCase(uri.getScheme())) {
imagePath = getImagePath(context,uri, null);
}
}else{
imagePath = getImagePath(context,uri, null);
}
return imagePath;
}
/**
* 通过uri和selection来获取真实的图片路径,从相册获取图片时要用
*/
private String getImagePath(Context context,Uri uri, String selection) {
String path = null;
Cursor cursor = context.getContentResolver().query(uri, null, selection, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
}
cursor.close();
}
return path;
}
}

View File

@@ -98,4 +98,17 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn4"
style="@style/OnClick"/>
<Button
android:id="@+id/btn6"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:text="识别一维码/二维码图片"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn5"
style="@style/OnClick"/>
</android.support.constraint.ConstraintLayout>

View File

@@ -1,6 +1,7 @@
<resources>
<string name="app_name">ZXingLite</string>
<string name="permission_camera">App扫码需要用到拍摄权限</string>
<string name="permission_external_storage">App需要用到读写权限</string>
<string name="tips_scan_code">将二维码/条形码放入框内,即可自动扫码</string>
<string name="qr_code">二维码</string>
<string name="bar_code">条形码</string>