Browse Source

Merge branch 'as' of https://github.com/jianboy/QRCode into as

# Conflicts:
#	.idea/gradle.xml
#	.idea/misc.xml
#	app/src/main/AndroidManifest.xml
#	app/src/main/java/me/yoqi/qrcode/CaptureActivity.java
#	app/src/main/java/me/yoqi/qrcode/ResultActivity.java
liuyuqi-dellpc 4 years ago
parent
commit
fdaeee255f

+ 1 - 0
.gitignore

@@ -15,3 +15,4 @@
 /build
 /build
 /captures
 /captures
 .externalNativeBuild
 .externalNativeBuild
+/.idea

+ 2 - 0
app/build.gradle

@@ -17,6 +17,8 @@ android {
     compileSdkVersion 29
     compileSdkVersion 29
 
 
     defaultConfig {
     defaultConfig {
+        versionCode 13
+        versionName "1.13"
         applicationId "me.yoqi.qrcode"
         applicationId "me.yoqi.qrcode"
         minSdkVersion 14
         minSdkVersion 14
         targetSdkVersion 29
         targetSdkVersion 29

+ 300 - 283
app/src/main/java/me/yoqi/qrcode/CaptureActivity.java

@@ -1,6 +1,7 @@
 package me.yoqi.qrcode;
 package me.yoqi.qrcode;
 
 
 import android.Manifest;
 import android.Manifest;
+import android.app.Activity;
 import android.content.Intent;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap;
@@ -21,8 +22,6 @@ import android.view.WindowManager;
 import android.widget.ImageView;
 import android.widget.ImageView;
 import android.widget.Toast;
 import android.widget.Toast;
 
 
-import androidx.appcompat.app.AppCompatActivity;
-
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.Result;
 import com.google.zxing.Result;
 import com.google.zxing.ResultPoint;
 import com.google.zxing.ResultPoint;
@@ -41,301 +40,319 @@ import java.util.Collection;
  * 识别二维码 CaptureActivity
  * 识别二维码 CaptureActivity
  *
  *
  * @author liuyuqi
  * @author liuyuqi
+ *
  */
  */
-public final class CaptureActivity extends AppCompatActivity implements SurfaceHolder.Callback {
-
-    private static final String TAG = CaptureActivity.class.getSimpleName();
-
-    private CameraManager cameraManager;
-    private CaptureActivityHandler handler;
-    private Result savedResultToShow;
-    private ViewfinderView viewfinderView;
-    private boolean hasSurface;
-    private Collection<BarcodeFormat> decodeFormats;
-    private InactivityTimer inactivityTimer;
-    private String characterSet;
-    private BeepManager beepManager;
-
-    ImageView opreateView;
-
-    ViewfinderView getViewfinderView() {
-        return viewfinderView;
-    }
-
-    public Handler getHandler() {
-        return handler;
-    }
-
-    public CameraManager getCameraManager() {
-        return cameraManager;
-    }
-
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        Window window = getWindow();
-        window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-        setContentView(R.layout.capture);
-
-        hasSurface = false;
-        inactivityTimer = new InactivityTimer(this);
-        beepManager = new BeepManager(this);
-        opreateView = (ImageView) findViewById(R.id.button_openorcloseClick);
-
-        opreateView.setOnClickListener(new OnClickListener() {
-
-            @Override
-            public void onClick(View v) {
-                if (cameraManager != null) {
-                    Config.KEY_FRONT_LIGHT = !Config.KEY_FRONT_LIGHT;
-                    if (Config.KEY_FRONT_LIGHT == true) {
-                        opreateView
-                                .setImageResource(R.drawable.mzw_camera_close);
-                    } else {
-                        opreateView
-                                .setImageResource(R.drawable.mzw_camera_open);
-                    }
-                    cameraManager.getConfigManager().initializeTorch(
-                            cameraManager.getCamera().getParameters(), false);
-                    onPause();
-                    onResume();
-                }
-            }
-        });
-
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-
-        // CameraManager must be initialized here, not in onCreate(). This is
-        // necessary because we don't
-        // want to open the camera driver and measure the screen size if we're
-        // going to show the help on
-        // first launch. That led to bugs where the scanning rectangle was the
-        // wrong size and partially
-        // off screen.
-        cameraManager = new CameraManager(getApplication());
-
-        viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
-        viewfinderView.setCameraManager(cameraManager);
-
-        handler = null;
-        SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
-        SurfaceHolder surfaceHolder = surfaceView.getHolder();
-        if (hasSurface) {
-            // The activity was paused but not stopped, so the surface still
-            // exists. Therefore
-            // surfaceCreated() won't be called, so init the camera here.
-            initCamera(surfaceHolder);
-        } else {
-            // Install the callback and wait for surfaceCreated() to init the
-            // camera.
-            surfaceHolder.addCallback(this);
-            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
-        }
-
-        beepManager.updatePrefs();
-
-        inactivityTimer.onResume();
-    }
+public final class CaptureActivity extends Activity implements SurfaceHolder.Callback {
+
+	private static final String TAG = CaptureActivity.class.getSimpleName();
+
+	private CameraManager cameraManager;
+	private CaptureActivityHandler handler;
+	private Result savedResultToShow;
+	private ViewfinderView viewfinderView;
+	private boolean hasSurface;
+	private Collection<BarcodeFormat> decodeFormats;
+	private InactivityTimer inactivityTimer;
+	private String characterSet;
+	private BeepManager beepManager;
+
+	ImageView opreateView;
+
+	ViewfinderView getViewfinderView() {
+		return viewfinderView;
+	}
+
+	public Handler getHandler() {
+		return handler;
+	}
+
+	public CameraManager getCameraManager() {
+		return cameraManager;
+	}
+
+	@Override
+	public void onCreate(Bundle icicle) {
+		super.onCreate(icicle);
+
+		Window window = getWindow();
+		window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+		setContentView(R.layout.capture);
+
+		hasSurface = false;
+		inactivityTimer = new InactivityTimer(this);
+		beepManager = new BeepManager(this);
+		opreateView = (ImageView) findViewById(R.id.button_openorcloseClick);
+
+		opreateView.setOnClickListener(new OnClickListener() {
+
+			@Override
+			public void onClick(View v) {
+				if (cameraManager != null) {
+					Config.KEY_FRONT_LIGHT = !Config.KEY_FRONT_LIGHT;
+					if (Config.KEY_FRONT_LIGHT == true) {
+						opreateView
+								.setImageResource(R.drawable.mzw_camera_close);
+					} else {
+						opreateView
+								.setImageResource(R.drawable.mzw_camera_open);
+					}
+					cameraManager.getConfigManager().initializeTorch(
+							cameraManager.getCamera().getParameters(), false);
+					onPause();
+					onResume();
+				}
+			}
+		});
+	}
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+
+		// CameraManager must be initialized here, not in onCreate(). This is
+		// necessary because we don't
+		// want to open the camera driver and measure the screen size if we're
+		// going to show the help on
+		// first launch. That led to bugs where the scanning rectangle was the
+		// wrong size and partially
+		// off screen.
+		cameraManager = new CameraManager(getApplication());
+
+		viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);
+		viewfinderView.setCameraManager(cameraManager);
+
+		handler = null;
+		SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view);
+		SurfaceHolder surfaceHolder = surfaceView.getHolder();
+		if (hasSurface) {
+			// The activity was paused but not stopped, so the surface still
+			// exists. Therefore
+			// surfaceCreated() won't be called, so init the camera here.
+			initCamera(surfaceHolder);
+		} else {
+			// Install the callback and wait for surfaceCreated() to init the
+			// camera.
+			surfaceHolder.addCallback(this);
+			surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+		}
+
+		beepManager.updatePrefs();
+
+		inactivityTimer.onResume();
+	}
+
+	@Override
+	protected void onPause() {
+		if (handler != null) {
+			handler.quitSynchronously();
+			handler = null;
+		}
+		inactivityTimer.onPause();
+		cameraManager.closeDriver();
+		if (!hasSurface) {
+			SurfaceView surfaceView = findViewById(R.id.preview_view);
+			SurfaceHolder surfaceHolder = surfaceView.getHolder();
+			surfaceHolder.removeCallback(this);
+		}
+		super.onPause();
+	}
 
 
     @Override
     @Override
-    protected void onPause() {
+    protected void onStop() {
         if (handler != null) {
         if (handler != null) {
             handler.quitSynchronously();
             handler.quitSynchronously();
             handler = null;
             handler = null;
         }
         }
-        inactivityTimer.onPause();
         cameraManager.closeDriver();
         cameraManager.closeDriver();
         if (!hasSurface) {
         if (!hasSurface) {
             SurfaceView surfaceView = findViewById(R.id.preview_view);
             SurfaceView surfaceView = findViewById(R.id.preview_view);
             SurfaceHolder surfaceHolder = surfaceView.getHolder();
             SurfaceHolder surfaceHolder = surfaceView.getHolder();
             surfaceHolder.removeCallback(this);
             surfaceHolder.removeCallback(this);
         }
         }
-        super.onPause();
-    }
-
-    @Override
-    protected void onDestroy() {
-        inactivityTimer.shutdown();
-        super.onDestroy();
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        switch (keyCode) {
-            case KeyEvent.KEYCODE_BACK:
-                // restartPreviewAfterDelay(0L);
-                return super.onKeyDown(keyCode, event);
-            case KeyEvent.KEYCODE_FOCUS:
-            case KeyEvent.KEYCODE_CAMERA:
-                // Handle these events so they don't launch the Camera app
-                return true;
-            // Use volume up/down to turn on light
-            case KeyEvent.KEYCODE_VOLUME_DOWN:
-                cameraManager.setTorch(false);
-                return true;
-            case KeyEvent.KEYCODE_VOLUME_UP:
-                cameraManager.setTorch(true);
-                return true;
-        }
-        return super.onKeyDown(keyCode, event);
-    }
-
-    private void decodeOrStoreSavedBitmap(Bitmap bitmap, Result result) {
-        // Bitmap isn't used yet -- will be used soon
-        if (handler == null) {
-            savedResultToShow = result;
-        } else {
-            if (result != null) {
-                savedResultToShow = result;
-            }
-            if (savedResultToShow != null) {
-                Message message = Message.obtain(handler,
-                        R.id.decode_succeeded, savedResultToShow);
-                handler.sendMessage(message);
-            }
-            savedResultToShow = null;
-        }
-    }
-
-    @Override
-    public void surfaceCreated(SurfaceHolder holder) {
-        if (holder == null) {
-            Log.e(TAG,
-                    "*** WARNING *** surfaceCreated() gave us a null surface!");
-        }
-        if (!hasSurface) {
-            hasSurface = true;
-            initCamera(holder);
-        }
-    }
-
-    @Override
-    public void surfaceDestroyed(SurfaceHolder holder) {
-        hasSurface = false;
+        super.onStop();
     }
     }
 
 
     @Override
     @Override
-    public void surfaceChanged(SurfaceHolder holder, int format, int width,
-                               int height) {
-
-    }
-
-    /**
-     * A valid barcode has been found, so give an indication of success and show
-     * the results.
-     *
-     * @param rawResult The contents of the barcode.
-     * @param barcode   A greyscale bitmap of the camera data which was decoded.
-     */
-    public void handleDecode(Result rawResult, Bitmap barcode) {
-        inactivityTimer.onActivity();
-        ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(
-                this, rawResult);
-
-        boolean fromLiveScan = barcode != null;
-        if (fromLiveScan) {
-            // Then not from history, so beep/vibrate and we have an image to
-            // draw on
-            beepManager.playBeepSoundAndVibrate();
-            // drawResultPoints(barcode, rawResult);
-            viewfinderView.drawResultBitmap(barcode);
-        }
-
-        String text = rawResult.getText();
-        Intent intent = new Intent(this, ResultActivity.class);
-        intent.putExtra("text", text);
-        startActivity(intent);
-//		Toast.makeText(this, "扫描结果:" + text, Toast.LENGTH_LONG).show();
-//		Log.d(TAG, "result-->" + text);
-    }
-
-    /**
-     * Superimpose a line for 1D or dots for 2D to highlight the key features of
-     * the barcode.
-     *
-     * @param barcode   A bitmap of the captured image.
-     * @param rawResult The decoded results which contains the points to draw.
-     */
-    private void drawResultPoints(Bitmap barcode, Result rawResult) {
-        ResultPoint[] points = rawResult.getResultPoints();
-        if (points != null && points.length > 0) {
-            Canvas canvas = new Canvas(barcode);
-            Paint paint = new Paint();
-            paint.setColor(getResources().getColor(R.color.result_points));
-            if (points.length == 2) {
-                paint.setStrokeWidth(4.0f);
-                drawLine(canvas, paint, points[0], points[1]);
-            } else if (points.length == 4
-                    && (rawResult.getBarcodeFormat() == BarcodeFormat.UPC_A || rawResult
-                    .getBarcodeFormat() == BarcodeFormat.EAN_13)) {
-                // Hacky special case -- draw two lines, for the barcode and
-                // metadata
-                drawLine(canvas, paint, points[0], points[1]);
-                drawLine(canvas, paint, points[2], points[3]);
-            } else {
-                paint.setStrokeWidth(10.0f);
-                for (ResultPoint point : points) {
-                    canvas.drawPoint(point.getX(), point.getY(), paint);
-                }
-            }
-        }
-    }
-
-    private static void drawLine(Canvas canvas, Paint paint, ResultPoint a,
-                                 ResultPoint b) {
-        canvas.drawLine(a.getX(), a.getY(), b.getX(), b.getY(), paint);
-    }
-
-    private void initCamera(SurfaceHolder surfaceHolder) {
-        //		权限检测
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-            if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
-                requestPermissions(new String[]{Manifest.permission.CAMERA}, 1);
-            }
-        }
-        if (surfaceHolder == null) {
-            throw new IllegalStateException("No SurfaceHolder provided");
-        }
-        if (cameraManager.isOpen()) {
-            Log.w(TAG,
-                    "initCamera() while already open -- late SurfaceView callback?");
-            return;
-        }
-        try {
-            cameraManager.openDriver(surfaceHolder);
-            // Creating the handler starts the preview, which can also throw a
-            // RuntimeException.
-            if (handler == null) {
-                handler = new CaptureActivityHandler(this, viewfinderView,
-                        decodeFormats, characterSet, cameraManager);
-            }
-            decodeOrStoreSavedBitmap(null, null);
-        } catch (IOException ioe) {
-            Log.w(TAG, ioe);
-            Toast.makeText(this, R.string.camera_problem, Toast.LENGTH_SHORT)
-                    .show();
-            finish();
-        } catch (RuntimeException e) {
-            // Barcode Scanner has seen crashes in the wild of this variety:
-            // java.?lang.?RuntimeException: Fail to connect to camera service
-            Log.w(TAG, "Unexpected error initializing camera", e);
-            Toast.makeText(this, R.string.framwork_problem, Toast.LENGTH_SHORT)
-                    .show();
-        }
-    }
-
-    public void restartPreviewAfterDelay(long delayMS) {
-        if (handler != null) {
-            handler.sendEmptyMessageDelayed(R.id.restart_preview, delayMS);
-        }
-    }
-
-    public void drawViewfinder() {
-        viewfinderView.drawViewfinder();
-    }
+	protected void onDestroy() {
+		inactivityTimer.shutdown();
+		super.onDestroy();
+	}
+
+	@Override
+	public boolean onKeyDown(int keyCode, KeyEvent event) {
+		switch (keyCode) {
+		case KeyEvent.KEYCODE_BACK:
+			// restartPreviewAfterDelay(0L);
+			return super.onKeyDown(keyCode, event);
+		case KeyEvent.KEYCODE_FOCUS:
+		case KeyEvent.KEYCODE_CAMERA:
+			// Handle these events so they don't launch the Camera app
+			return true;
+			// Use volume up/down to turn on light
+		case KeyEvent.KEYCODE_VOLUME_DOWN:
+			cameraManager.setTorch(false);
+			return true;
+		case KeyEvent.KEYCODE_VOLUME_UP:
+			cameraManager.setTorch(true);
+			return true;
+		}
+		return super.onKeyDown(keyCode, event);
+	}
+
+	private void decodeOrStoreSavedBitmap(Bitmap bitmap, Result result) {
+		// Bitmap isn't used yet -- will be used soon
+		if (handler == null) {
+			savedResultToShow = result;
+		} else {
+			if (result != null) {
+				savedResultToShow = result;
+			}
+			if (savedResultToShow != null) {
+				Message message = Message.obtain(handler,
+						R.id.decode_succeeded, savedResultToShow);
+				handler.sendMessage(message);
+			}
+			savedResultToShow = null;
+		}
+	}
+
+	@Override
+	public void surfaceCreated(SurfaceHolder holder) {
+		if (holder == null) {
+			Log.e(TAG,
+					"*** WARNING *** surfaceCreated() gave us a null surface!");
+		}
+		if (!hasSurface) {
+			hasSurface = true;
+			initCamera(holder);
+		}
+	}
+
+	@Override
+	public void surfaceDestroyed(SurfaceHolder holder) {
+		hasSurface = false;
+	}
+
+	@Override
+	public void surfaceChanged(SurfaceHolder holder, int format, int width,
+			int height) {
+
+	}
+
+	/**
+	 * A valid barcode has been found, so give an indication of success and show
+	 * the results.
+	 *
+	 * @param rawResult
+	 *            The contents of the barcode.
+	 * @param barcode
+	 *            A greyscale bitmap of the camera data which was decoded.
+	 */
+	public void handleDecode(Result rawResult, Bitmap barcode) {
+		inactivityTimer.onActivity();
+		ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(
+				this, rawResult);
+
+		boolean fromLiveScan = barcode != null;
+		if (fromLiveScan) {
+			// Then not from history, so beep/vibrate and we have an image to
+			// draw on
+			beepManager.playBeepSoundAndVibrate();
+			// drawResultPoints(barcode, rawResult);
+			viewfinderView.drawResultBitmap(barcode);
+		}
+
+		String text = rawResult.getText();
+		Intent intent = new Intent(this, ResultActivity.class);
+		intent.putExtra("text", text);
+		startActivity(intent);
+        cameraManager.closeDriver();
+	}
+
+	/**
+	 * Superimpose a line for 1D or dots for 2D to highlight the key features of
+	 * the barcode.
+	 *
+	 * @param barcode
+	 *            A bitmap of the captured image.
+	 * @param rawResult
+	 *            The decoded results which contains the points to draw.
+	 */
+	private void drawResultPoints(Bitmap barcode, Result rawResult) {
+		ResultPoint[] points = rawResult.getResultPoints();
+		if (points != null && points.length > 0) {
+			Canvas canvas = new Canvas(barcode);
+			Paint paint = new Paint();
+			paint.setColor(getResources().getColor(R.color.result_points));
+			if (points.length == 2) {
+				paint.setStrokeWidth(4.0f);
+				drawLine(canvas, paint, points[0], points[1]);
+			} else if (points.length == 4
+					&& (rawResult.getBarcodeFormat() == BarcodeFormat.UPC_A || rawResult
+							.getBarcodeFormat() == BarcodeFormat.EAN_13)) {
+				// Hacky special case -- draw two lines, for the barcode and
+				// metadata
+				drawLine(canvas, paint, points[0], points[1]);
+				drawLine(canvas, paint, points[2], points[3]);
+			} else {
+				paint.setStrokeWidth(10.0f);
+				for (ResultPoint point : points) {
+					canvas.drawPoint(point.getX(), point.getY(), paint);
+				}
+			}
+		}
+	}
+
+	private static void drawLine(Canvas canvas, Paint paint, ResultPoint a,
+			ResultPoint b) {
+		canvas.drawLine(a.getX(), a.getY(), b.getX(), b.getY(), paint);
+	}
+
+	private void initCamera(SurfaceHolder surfaceHolder) {
+		//		权限检测
+		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+			if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
+				requestPermissions(new String[]{Manifest.permission.CAMERA}, 1);
+			}
+		}
+		if (surfaceHolder == null) {
+			throw new IllegalStateException("No SurfaceHolder provided");
+		}
+		if (cameraManager.isOpen()) {
+			Log.w(TAG,
+					"initCamera() while already open -- late SurfaceView callback?");
+			return;
+		}
+		try {
+			cameraManager.openDriver(surfaceHolder);
+			// Creating the handler starts the preview, which can also throw a
+			// RuntimeException.
+			if (handler == null) {
+				handler = new CaptureActivityHandler(this, viewfinderView,
+						decodeFormats, characterSet, cameraManager);
+			}
+			decodeOrStoreSavedBitmap(null, null);
+		} catch (IOException ioe) {
+			Log.w(TAG, ioe);
+			Toast.makeText(this, R.string.camera_problem, Toast.LENGTH_SHORT)
+					.show();
+			finish();
+		} catch (RuntimeException e) {
+			// Barcode Scanner has seen crashes in the wild of this variety:
+			// java.?lang.?RuntimeException: Fail to connect to camera service
+			Log.w(TAG, "Unexpected error initializing camera", e);
+			Toast.makeText(this, R.string.framwork_problem, Toast.LENGTH_SHORT)
+					.show();
+		}
+	}
+
+	public void restartPreviewAfterDelay(long delayMS) {
+		if (handler != null) {
+			handler.sendEmptyMessageDelayed(R.id.restart_preview, delayMS);
+		}
+	}
+
+	public void drawViewfinder() {
+		viewfinderView.drawViewfinder();
+	}
 }
 }

+ 24 - 3
app/src/main/java/me/yoqi/qrcode/ResultActivity.java

@@ -1,18 +1,24 @@
 package me.yoqi.qrcode;
 package me.yoqi.qrcode;
 
 
 import android.annotation.SuppressLint;
 import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.content.ClipData;
 import android.content.ClipData;
 import android.content.ClipboardManager;
 import android.content.ClipboardManager;
 import android.content.Intent;
 import android.content.Intent;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
 import android.widget.EditText;
 import android.widget.EditText;
 
 
-import androidx.appcompat.app.AppCompatActivity;
+import me.yoqi.qrcode.utils.StringUtils;
 
 
-public class ResultActivity extends AppCompatActivity {
+public class ResultActivity extends Activity {
 
 
     private EditText et_result;
     private EditText et_result;
+    private Button btn_url;
     ClipboardManager myClipboard;
     ClipboardManager myClipboard;
+    String text;
 
 
     @SuppressLint("NewApi")
     @SuppressLint("NewApi")
     @Override
     @Override
@@ -21,8 +27,13 @@ public class ResultActivity extends AppCompatActivity {
         setContentView(R.layout.activity_result);
         setContentView(R.layout.activity_result);
         initView();
         initView();
         Intent intent = getIntent();
         Intent intent = getIntent();
-        String text = intent.getStringExtra("text");
+        text = intent.getStringExtra("text");
         et_result.setText(text);
         et_result.setText(text);
+        if (StringUtils.isHttpUrl(text)) {
+            btn_url.setVisibility(View.VISIBLE);
+        } else {
+            btn_url.setVisibility(View.GONE);
+        }
 
 
         myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
         myClipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
 
 
@@ -32,5 +43,15 @@ public class ResultActivity extends AppCompatActivity {
 
 
     private void initView() {
     private void initView() {
         et_result = (EditText) findViewById(R.id.et_result);
         et_result = (EditText) findViewById(R.id.et_result);
+        btn_url = (Button) findViewById(R.id.btn_url);
+        btn_url.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                Intent intent = new Intent();
+                intent.setData(Uri.parse(text));//Url 就是你要打开的网址
+                intent.setAction(Intent.ACTION_VIEW);
+                startActivity(intent); //启动浏览器
+            }
+        });
     }
     }
 }
 }

+ 30 - 0
app/src/main/java/me/yoqi/qrcode/utils/StringUtils.java

@@ -0,0 +1,30 @@
+package me.yoqi.qrcode.utils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class StringUtils {
+
+    /**
+     * 判断字符串是否为网址
+     *
+     * @param urls 链接字符串
+     * @return
+     */
+    public static boolean isHttpUrl(String urls) {
+        boolean isurl = false;
+        if (urls.startsWith("http://") || urls.startsWith("https://")){
+            return true;
+        }
+        String regex = "(((https|http)?://)?([a-z0-9]+[.])|(www.))"
+                + "\\w+[.|\\/]([a-z0-9]{0,})?[[.]([a-z0-9]{0,})]+((/[\\S&&[^,;\u4E00-\u9FA5]]+)+)?([.][a-z0-9]{0,}+|/?)";//设置正则表达式
+
+        Pattern pat = Pattern.compile(regex.trim());//比对
+        Matcher mat = pat.matcher(urls.trim());
+        isurl = mat.matches();//判断是否匹配
+        if (isurl) {
+            isurl = true;
+        }
+        return isurl;
+    }
+}

+ 13 - 2
app/src/main/res/layout/activity_result.xml

@@ -9,6 +9,7 @@
         android:layout_width="match_parent"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginBottom="10dp"
         android:layout_marginBottom="10dp"
+        android:textSize="20dp"
         android:text="@string/scan_result" />
         android:text="@string/scan_result" />
 
 
     <EditText
     <EditText
@@ -16,11 +17,21 @@
         android:layout_width="match_parent"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginBottom="10dp"
         android:layout_marginBottom="10dp"
-        android:lines="5" />
+        android:minLines="5" />
+
+    <Button
+        android:id="@+id/btn_url"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/qrcode_open"
+        android:visibility="gone" />
 
 
     <TextView
     <TextView
         android:layout_width="match_parent"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/auto_copy" />
+        android:paddingTop="10dp"
+        android:gravity="center"
+        android:text="@string/auto_copy"
+        android:textSize="17sp" />
 
 
 </LinearLayout>
 </LinearLayout>

+ 0 - 0
gradlew