1、支持条形码下方显示Code。
2、优化扫条形码。 3、优化相机预览尺寸遍历策略、从而降低变形的可能性。
This commit is contained in:
Binary file not shown.
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
69
app/src/main/java/com/king/zxing/app/util/UriUtils.java
Normal file
69
app/src/main/java/com/king/zxing/app/util/UriUtils.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user