Androidフレームワークの2次元コードフレームワークzxingのクイックスタート

Zxingの使用

依存関係をインポートします。

compile 'cn.yipianfengye.android:zxing-library:2.2'

アクセスのリクエスト:

<!--震动权限-->
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--照相机权限-->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" /> <!-- 使用照相机权限 -->
    <uses-feature android:name="android.hardware.camera.autofocus" /> <!-- 自动聚焦权限 -->

Android 6.0以降の場合は動的に許可を申請する

String[] permissions=new String[]{
    
    Manifest.permission.
                WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
    
    
            requestPermissions(permissions,PERMS_REQUEST_CODE);
        }

最初のステップは初期化です。

ZXingLibrary.initDisplayOpinion(this);

インテントによる単純なスキャン:

 //设置进行扫描二维码
Intent intent = new Intent();
intent.setClass(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent,REQUEST);

または携帯電話の写真を使用してスキャンします

//进行跳转到图片
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_IMAGE);

単純なスキャン結果が処理されます。

if(requestCode == 1){
    
    
    //进行简单扫描
    //获取数据
    if(data != null){
    
    
        Bundle bundle = data.getExtras();
        //判断bundle中存储的数据是否代表解析成功
        if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS){
    
    
            //获取解析结果
            String result = bundle.getString(CodeUtils.RESULT_STRING);
            Toast.makeText(MainActivity.this,"解析结果"+result,Toast.LENGTH_SHORT).show();
        }else{
    
    
            Toast.makeText(MainActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
        }
    }

}

ギャラリー内の画像の QR コード処理の結果:

public static String deCodeQR(Bitmap bitmap) {
    
    
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
    RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
    BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));
    Result result = null;
    QRCodeReader reader = new QRCodeReader();
    try {
    
    
        result = reader.decode(binaryBitmap);
    } catch (NotFoundException e) {
    
    
        e.printStackTrace();
    } catch (ChecksumException e) {
    
    
        e.printStackTrace();
    } catch (FormatException e) {
    
    
        e.printStackTrace();
    }
    if(result == null || result.equals("")){
    
    
        return "解析结果失败";
    }
    return result.getText();
}

スキャンデータを取得するには:

if(requestCode == 2){
    
    
    //进行图片扫描
    if(data != null){
    
    
        //获取Uri
        Uri uri = data.getData();
        ContentResolver contentResolver = getContentResolver();
        try {
    
    
            Bitmap bitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri);//获取对应的Bitmap图片
            //解析bitmap二维码图片
            String s = deCodeQR(bitmap);
            Toast.makeText(this,s,Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

    }
}

QR コードをスキャンするためのカスタム レイアウトを設定します。

2 つのレイアウト ファイルは次のとおりです。

1.値の色ファイルの下に色を追加して、QRコードの4つの境界線の色を決定します

#0effc22.
2. ドローアブル ファイルの下に、QR コードでスキャンされた水平線である scan_image.png 画像を追加します。

3. 新しいアクティビティ (デモでは SecondActivity と呼ばれる) を作成して FragmentActivity を統合し、マニフェスト ファイルで構成します。

  1. QR コードの背景レイアウトである新しいアクティビティ レイアウト ファイルを変更します。

  2. 技術的なポイント: ID が fl_my_container である FrameLayout を開始します。これは置き換える必要があるスキャン コンポーネントです。

定義したスキャン フラグメントは、ID fl_my_container を持つ FrameLayout に置き換えられます。

上のボタンは追加したコントロールであり、任意のコントロールやさまざまな UI 効果などを追加できます。

  1. my_camera.xml レイアウト ファイルを作成します。これは QR コードをスキャンするためのインターフェイスです

QR コード スキャン ページをカスタマイズするには、このレイアウトで変更します。ここではツールバーとボタン ボタンを追加しました。

スキャンを終了するときに使用します。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_second"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/second_button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|center_horizontal"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:text="取消二维码扫描" />
    <FrameLayout
        android:id="@+id/fl_my_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>
</FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <SurfaceView
        android:id="@+id/preview_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <com.uuzuche.lib_zxing.view.ViewfinderView
        android:id="@+id/viewfinder_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:inner_corner_length="30dp"
        app:inner_corner_width="5dp"
        app:inner_height="200dp"
        app:inner_margintop="150dp"
        app:inner_scan_iscircle="false"
        app:inner_scan_speed="10"
        app:inner_width="200dp" />
</FrameLayout>

SecondActivity ファイル (CaptureActivity.java の代わり)

package com.it.zxing;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.uuzuche.lib_zxing.activity.CaptureFragment;
import com.uuzuche.lib_zxing.activity.CodeUtils;

public class SecondActivity extends AppCompatActivity {
    
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment);

        CodeUtils.AnalyzeCallback analyzeCallback = new CodeUtils.AnalyzeCallback() {
    
    
            @Override
            public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
    
    
                Intent resultIntent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_SUCCESS);
                bundle.putString(CodeUtils.RESULT_STRING, result);
                resultIntent.putExtras(bundle);
                SecondActivity.this.setResult(RESULT_OK, resultIntent);
                SecondActivity.this.finish();
            }

            @Override
            public void onAnalyzeFailed() {
    
    
                Intent resultIntent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putInt(CodeUtils.RESULT_TYPE, CodeUtils.RESULT_FAILED);
                bundle.putString(CodeUtils.RESULT_STRING, "");
                resultIntent.putExtras(bundle);
                SecondActivity.this.setResult(RESULT_OK, resultIntent);
                SecondActivity.this.finish();
            }
        };

        //在Activity中执行Fragment的初始化操作
        //执行扫面Fragment的初始化操作
        CaptureFragment captureFragment = new CaptureFragment();
        // 为二维码扫描界面设置定制化界面
        CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
        captureFragment.setAnalyzeCallback(analyzeCallback);
        getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();
        //进行展示
    }
}

QRコード画像の生成(ロゴなし)

button1.setOnClickListener(new View.OnClickListener() {
    
    
    @Override
    public void onClick(View v) {
    
    

        String textContent = editText.getText().toString();
        if (TextUtils.isEmpty(textContent)) {
    
    
            Toast.makeText(ThreeActivity.this, "您的输入为空!", Toast.LENGTH_SHORT).show();
            return;
        }
        editText.setText("");
        mBitmap = CodeUtils.createImage(textContent, 400, 400, null);
        imageView.setImageBitmap(mBitmap);
    }
});

おすすめ

転載: blog.csdn.net/weixin_45927121/article/details/120686174