首先要下载所需要的源码,可以从zxing官网下载,下载压缩包然后解压到自己要放的地址
然后导入zxing包,下载的zxing源码中我们能用到的大概就camera,decoding,view三个包,可直接拷出来放到自己项目中,下面是我自己的目录
再者,需要将
import com.google.zxing.integration.android.IntentIntegrator;import com.google.zxing.integration.android.IntentResult;两个类的源码放到自己项目中
在build.gradle中加入下面代码
implementation 'com.journeyapps:zxing-android-embedded:4.2.0'
implementation 'com.google.code.gson:gson:2.8.0'
在AndroidManifest.xml中加入
<uses-permission android:name="android.permission.CAMERA"/>
我们需要编码的只有MainActivity和MipcaActivityCapture两个activity
package com.example.helloword1.zxing.Main;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.TextView;import com.example.helloword1.zxing.R;public class MainActivity extends AppCompatActivity {private final static int SCANNIN_GREQUEST_CODE = 1;private TextView mTextView ;private ImageView mImageView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView = (TextView) findViewById(R.id.result);mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);Button mButton = (Button) findViewById(R.id.button1);mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setClass(MainActivity.this, MipcaActivityCapture.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivityForResult(intent, SCANNIN_GREQUEST_CODE);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case SCANNIN_GREQUEST_CODE:if(resultCode == RESULT_OK){Bundle bundle = data.getExtras();//��ʾɨ�赽������mTextView.setText(bundle.getString("result"));//��ʾmImageView.setImageBitmap((Bitmap) data.getParcelableExtra("bitmap"));}break;}}}
另MipcaActivityCapture代码如下
package com.example.helloword1.zxing.Main;import android.app.Activity;import android.content.Intent;import android.content.res.AssetFileDescriptor;import android.graphics.Bitmap;import android.media.AudioManager;import android.media.MediaPlayer;import android.os.Bundle;import android.os.Vibrator;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.widget.Button;import android.widget.Toast;import com.example.helloword1.zxing.R;importimport com.example.helloword1.zxing.mining.app.zxing.camera.CameraManager;import com.example.helloword1.zxing.mining.app.zxing.decoding.CaptureActivityHandler;import com.example.helloword1.zxing.mining.app.zxing.decoding.InactivityTimer;import com.example.helloword1.zxing.mining.app.zxing.view.ViewfinderView;import java.io.IOException;import java.util.Vector;import javax.security.auth.callback.Callback;import javax.xml.transform.Result;public class MipcaActivityCapture extends Activity implements Callback {private CaptureActivityHandler handler;private ViewfinderView viewfinderView;private boolean hasSurface;private Vector<BarcodeFormat> decodeFormats;private String characterSet;private InactivityTimer inactivityTimer;private MediaPlayer mediaPlayer;private boolean playBeep;private static final float BEEP_VOLUME = 0.10f;private boolean vibrate;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_capture);//ViewUtil.addTopView(getApplicationContext(), this, R.string.scan_card);CameraManager.init(getApplication());viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);Button mButtonBack = (Button) findViewById(R.id.button_back);mButtonBack.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {MipcaActivityCapture.this.finish();}});hasSurface = false;inactivityTimer = new InactivityTimer(this);}@Overrideprotected void onResume() {super.onResume();SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);SurfaceHolder surfaceHolder = surfaceView.getHolder();if (hasSurface) {initCamera(surfaceHolder);} else {surfaceHolder.addCallback(this);surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);}decodeFormats = null;characterSet = null;playBeep = true;AudioManager audioService = (AudioManager) getSystemService(AUDIO_SERVICE);if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {playBeep = false;}initBeepSound();vibrate = true;}@Overrideprotected void onPause() {super.onPause();if (handler != null) {handler.quitSynchronously();handler = null;}CameraManager.get().closeDriver();}@Overrideprotected void onDestroy() {inactivityTimer.shutdown();super.onDestroy();}/*** ����ɨ����* @param result* @param barcode*/public void handleDecode(Result result, Bitmap barcode) {inactivityTimer.onActivity();playBeepSoundAndVibrate();String resultString = result.getText();if (resultString.equals("")) {Toast.makeText(MipcaActivityCapture.this, "Scan failed!", Toast.LENGTH_SHORT).show();}else {Intent resultIntent = new Intent();Bundle bundle = new Bundle();bundle.putString("result", resultString);bundle.putParcelable("bitmap", barcode);resultIntent.putExtras(bundle);this.setResult(RESULT_OK, resultIntent);}MipcaActivityCapture.this.finish();}private void initCamera(SurfaceHolder surfaceHolder) {try {CameraManager.get().openDriver(surfaceHolder);} catch (IOException ioe) {return;} catch (RuntimeException e) {return;}if (handler == null) {handler = new CaptureActivityHandler(this, decodeFormats,characterSet);}}@Overridepublic void surfaceCreated(SurfaceHolder holder) {if (!hasSurface) {hasSurface = true;initCamera(holder);}}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {hasSurface = false;}public ViewfinderView getViewfinderView() {return viewfinderView;}public Handler getHandler() {return handler;}public void drawViewfinder() {viewfinderView.drawViewfinder();}private void initBeepSound() {if (playBeep && mediaPlayer == null) {// The volume on STREAM_SYSTEM is not adjustable, and users found it// too loud,// so we now play on the music stream.setVolumeControlStream(AudioManager.STREAM_MUSIC);mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setOnCompletionListener(beepListener);AssetFileDescriptor file = getResources().openRawResourceFd(R.raw.beep);try {mediaPlayer.setDataSource(file.getFileDescriptor(),file.getStartOffset(), file.getLength());file.close();mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);mediaPlayer.prepare();} catch (IOException e) {mediaPlayer = null;}}}private static final long VIBRATE_DURATION = 200L;private void playBeepSoundAndVibrate() {if (playBeep && mediaPlayer != null) {mediaPlayer.start();}if (vibrate) {Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);vibrator.vibrate(VIBRATE_DURATION);}}/*** When the beep has finished playing, rewind to queue up another one.*/private final OnCompletionListener beepListener = new OnCompletionListener() {public void onCompletion(MediaPlayer mediaPlayer) {mediaPlayer.seekTo(0);}};}
然后我们需要对页面进行布局部分代码如下所示,是我自己弄的,可以参考进行
下面是运行结果