android一般都是使用ZXing Android Embedded这个库来进行二维码操作!,我以前也没弄过这个,也有一些不错第三方库,也是看别人的博客现在第一次弄各位大佬有提议的可以说
二维码处理分为两部分:编码与解码
编码:使用字符串生成图片。
解码:解析图片中的字符串。
首先看一下效果:
添加依赖
implementation 'com.journeyapps:zxing-android-embedded:3.6.0'
implementation 'com.google.zxing:core:3.3.0'
Activity
boolean isTure=true,isFalse=true;
String[] pers;
pers=new String[]{Manifest.permission.CAMERA};
if(Build.VERSION_CODES.M>22){
for (int i = 0; i <pers.length ; i++) {
if(checkCallingPermission(pers[i])!=PackageManager.PERMISSION_GRANTED){
isTrue=false;
}
}
if(isTrue==false){
requestPermissions(pers,100);
}
}
//另一种动态申请权限的方式
// if(Build.VERSION.SDK_INT>22){
// if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)!= PackageManager.PERMISSION_GRANTED){
// ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1);
// }else{
//
// }
// }else{
//
// }
在Activity中自己定义一个按钮
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IntentIntegrator intentIntegrator = new IntentIntegrator(MainActivity.this);
intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);//扫码的类型,可选:一维码,二维码
intentIntegrator.setPrompt("请对准二维码");//提示语
intentIntegrator.setBeepEnabled(true);//扫完之后 叮的一声
intentIntegrator.setCaptureActivity(ScanActivity.class);自定义扫码界面
intentIntegrator.initiateScan();//初始化扫码
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if(result!=null){
if(result.getContents()==null){
Toast.makeText(this, "取消", Toast.LENGTH_SHORT).show();
Log.e("##","失败");
}else{
Toast.makeText(this, "成功"+result.getContents(), Toast.LENGTH_SHORT).show();
Log.e("##","成功!");
}
}else{
super.onActivityResult(requestCode,resultCode,data);
}
}
@SuppressLint("NewApi")
@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){
//有权限
}else{
Toast.makeText(this, "请手动打开相机权限", Toast.LENGTH_SHORT).show();
}
break;
case 100:
for (int i = 0; i <grantResults.length ; i++) {
if(grantResults[i]!=PackageManager.PERMISSION_GRANTED){
//有权限
}
}
if(isFalse==false){
Toast.makeText(this, "请手动添加权限", Toast.LENGTH_SHORT).show();
}
break;
}
}
自定义一个merge标签 xml文件
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto">
<com.journeyapps.barcodescanner.BarcodeView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zxing_barcode_surface"
app:zxing_framing_rect_width="300dp"
app:zxing_framing_rect_height="300dp"/>
<com.journeyapps.barcodescanner.ViewfinderView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/zxing_viewfinder_view"
/>
<TextView
android:id="@+id/zxing_status_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:background="@color/zxing_transparent"
android:text="@string/zxing_msg_default_status"
android:textColor="@color/zxing_status_text"/>
</merge>
自定义扫码布局文件
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:id="@+id/dbv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
app:zxing_scanner_layout="@layout/conten_scan"
tools:ignore="RtlCompat">
</com.journeyapps.barcodescanner.DecoratedBarcodeView>
<ImageButton
android:id="@+id/but_light"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="50dp"
android:background="@drawable/flashlight_close"
/>
自定义扫码的Activity
CaptureManager captureManager;
ImageButton imageButton;
DecoratedBarcodeView barcodeView;
boolean bTorch=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
barcodeView=findViewById(R.id.dbv);
imageButton=findViewById(R.id.but_light);
barcodeView.setTorchListener(new DecoratedBarcodeView.TorchListener() {
@SuppressLint("NewApi")
@Override
public void onTorchOn() {
imageButton.setBackground(getResources().getDrawable(R.drawable.flashlight_open));
bTorch=true;
}
@SuppressLint("NewApi")
@Override
public void onTorchOff() {
imageButton.setBackground(getResources().getDrawable(R.drawable.flashlight_close));
bTorch = false;
}
});
//打开闪光灯
imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(bTorch){
barcodeView.setTorchOff();
}else{
barcodeView.setTorchOn();
}
}
});
captureManager=new CaptureManager(this,barcodeView);
captureManager.initializeFromIntent(getIntent(),savedInstanceState);
captureManager.decode();
}
@Override
protected void onResume() {
super.onResume();
captureManager.onResume();
}
@Override
protected void onPause() {
super.onPause();
captureManager.onPause();
barcodeView.setTorchOff();
}
@Override
protected void onDestroy() {
super.onDestroy();
captureManager.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
captureManager.onSaveInstanceState(outState);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
captureManager.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return barcodeView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}