仿照微信识别相册中二维码,写了一个Demo,供参考使用
1、添加依赖,基于zxing,使用了Glide选择的图片进行了显示
compile 'com.google.zxing:core:3.2.1'
compile 'cn.bingoogolapple:bga-qrcodecore:1.1.3@aar'
compile 'cn.bingoogolapple:bga-zxing:1.1.3@aar'
compile 'com.github.bumptech.glide:glide:3.7.0'
2、详细代码,注释写的很清楚
测试过程中发现小米手机相册返回的Uri格式会导致程序崩溃,对返回的Uri进行了处理,该问题已解决
/**
* @author geqipeng
* @date 2017/8/31
*/
public class ThirdActivity extends Activity {
private static final int CODE_GALLERY_REQUEST = 1;
private ImageView mImageShow;
private TextView mTvContent;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
initView();
}
private void initView() {
mImageShow = (ImageView) findViewById(R.id.image_show);
mTvContent = (TextView) findViewById(R.id.tv_content);
//选择相册中图片
findViewById(R.id.btn_choice_pic).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intentFromGallery = new Intent();
intentFromGallery.setType("image/*");
intentFromGallery.setAction(Intent.ACTION_PICK);
startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CODE_GALLERY_REQUEST) {
Uri uri = data.getData();
String[] filePathColumn = {MediaStore.Audio.Media.DATA};
if (null == filePathColumn) {
return;
}
Cursor cursor = getContentResolver().query(getFileUri(uri), null, null, null, null);
cursor.moveToFirst();
//获取到的图片路径
String photoPath = cursor.getString(cursor.getColumnIndex(filePathColumn[0]));
cursor.close();
//使用glide加载选择的图片
Glide.with(this).load(uri).into(mImageShow);
//显示获取到的信息
String result = QRCodeDecoder.syncDecodeQRCode(photoPath);
mTvContent.setText(result);
}
}
/**
* 处理uri方法,防止获取失败
* @param uri
* @return
*/
private Uri getFileUri(Uri uri) {
try {
if (uri.getScheme().equals("file")) {
String path = uri.getEncodedPath();
if (path != null) {
path = Uri.decode(path);
ContentResolver cr = this.getContentResolver();
StringBuffer buff = new StringBuffer();
buff.append("(")
.append(MediaStore.Images.ImageColumns.DATA)
.append("=")
.append("'" + path + "'")
.append(")");
Cursor cur = cr.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.ImageColumns._ID},
buff.toString(), null, null);
int index = 0;
for (cur.moveToFirst(); !cur.isAfterLast(); cur
.moveToNext()) {
index = cur.getColumnIndex(MediaStore.Images.ImageColumns._ID);
index = cur.getInt(index);
}
if (index == 0) {
} else {
Uri uri_temp = Uri
.parse("content://media/external/images/media/"
+ index);
if (uri_temp != null) {
uri = uri_temp;
}
}
}
}
} catch (Exception e) {
}
return uri;
}
}
3、layout布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_choice_pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="选择图片"/>
<ImageView
android:id="@+id/image_show"
android:layout_width="200dp"
android:layout_height="200dp" />
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textSize="14sp"/>
</LinearLayout>
4、效果图
吃水不忘挖井人:
感谢:http://blog.csdn.net/fan7983377/article/details/51499508