Android开发中的二维码

1. 二维码的制作

2. 二维码的组成

  • 二维码是由黑白小点和左上左下右上三个正方形组成。

  • 黑白小点:黑点代表二进制里面的1,白点代表而进行里面的0。

  • 正方形:限定了二维码的范围,扫描的时候必须把三个正方形放在扫描区域内。

  • 二维码越密集,表示信息量越大,二维码越稀疏,表示信息量较少。

  • 注意:二维码允许20%左右的区域被遮挡,此时根据算法依然可以扫描出正确内容。

3. 利用二维码第三方库ZXING进行Android开发

3.1 第三方jar包下载地址:
链接:http://pan.baidu.com/s/1c1WKN5m 密码:qjil
3.2 进行开发

3.2.1(以下步骤顺序不要变,否则可能会出错)

1. 创建一个名为QR_code的项目,修改MainActivity和activity_main.xml:

MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button bt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initClick();

    }

    private void initClick() {
        bt.setOnClickListener(this);
    }

    private void initView() {
        bt = (Button) findViewById(R.id.bt_scan);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.bt_scan:

                break;
        }
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.fkq.qr_code.MainActivity">

    <Button
        android:id="@+id/bt_scan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Scan"
        android:textSize="30sp" />
</RelativeLayout>

说明:创建一个Button的点击事件。

2. File-New-Import-Module,导入ZXINGCODELIBS项目。

3. 修改ZXINGCODELIBS项目的bulid.gradle,以下地方形式代码如下:

修改之后的apply:
apply plugin: 'com.android.library'
删除了一行信息并且把依赖库的最低兼容版本和目标SDK版本修改为和主项目一致:
defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
    }
数字部分和主项目一致
compileSdkVersion 25
    buildToolsVersion "25.0.1"

4. 添加依赖库(File-Project Structure-Dependencies)

5. 修改主项目配置文件(如果不报manifest错误就忽视这一步骤):

  • manifest根标签内添加:
xmlns:tools="http://schemas.android.com/tools"
  • application标签上添加:
 tools:replace="Android:icon, android:theme"
  • 我的项目配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.fkq.qr_code">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="Android:icon, android:theme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

6. 同步Sync。

7. 删除依赖库ZXINGCODELIBS配置文件下的表示主程序的代码:

<intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

8. 这个时候修改MainActivity和CaptureActivity里面的代码,添加按钮点击事件,跳转到CaptureActivity,也就是摄像头的页面,并且返回数据给页面,并对返回回来的数据做处理,并加入了运行时权限,测试手机为vivo x9i ,好像运行时权限不是特别管用,真机不像模拟器一样对运行时权限敏感,可能是私人定制的问题,大家如果对这部分有想法可以留言给我

MainActivity:

/**
     * 处理点击事件
     *
     * @param view
     */
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.bt_scan:
//               跳转页面需要返回一个结果
                Intent intent = new Intent(this, CaptureActivity.class);
                startActivityForResult(intent, 1);
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            //获取解析的数据
            text = data.getStringExtra("text");
            Log.e(TAG, "text:" + text);
            handleResult(text);
        }
    }

CaptureActivity:

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();

        Log.d(TAG, "result:::" + text);

        //讲扫描的结果返回给入口Activity
        Intent data = new Intent();
        data.putExtra("text",text);
        setResult(RESULT_OK,data);

        finish();
    }

handleResult()方法:

 /**
     * 处理扫描结果
     */
    private void handleResult(String text) {
        //网址:http://或者是https://
        //电话:tel:110
        //信息:smsto:12589654123
        //邮件:mailto:xx@163.com
        //应用市场:market://
        //普通字符串:
        if (TextUtils.isEmpty(text)) {
            return;
        }

        if (text.startsWith("http://") || text.startsWith("https://")) {
            jumpToweb();
        } else if (text.startsWith("tel:")) {
            if (ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 1);
            } else {
                jumpTocall();
            }
        } else if (text.startsWith("smsto:")) {
            if (ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 2);
            } else {
                jumpTosms();
            }
        } else if (text.startsWith("mailto:")) {
            if (ContextCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, 3);
            } else {
                jumpTomail();
            }
        } else if (text.startsWith("market://")) {
            jumpTomarket();
        } else {
            //用弹窗展示信息,如果信息扫描不符合以上规范
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("扫描结果:");//标题
            builder.setMessage(text);//内容
            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Toast.makeText(getApplicationContext(), "确定", Toast.LENGTH_SHORT).show();
                }
            });
            builder.show();
        }
    }

    /**
     * 跳转到应用市场
     */
    private void jumpTomarket() {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(text));
        startActivity(intent);
    }

    /**
     * 发邮件(同样是SENDTO)
     */
    private void jumpTomail() {
        try {
            Intent intent = new Intent(Intent.ACTION_SENDTO);
            intent.setData(Uri.parse(text));
            startActivity(intent);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

    /**
     * 跳转到发信息
     */
    private void jumpTosms() {
        try {
            Intent intent = new Intent(Intent.ACTION_SENDTO);
            intent.setData(Uri.parse(text));
            startActivity(intent);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

    /**
     * 跳转到打电话
     */
    private void jumpTocall() {
        try {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse(text));
            startActivity(intent);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

    /**
     * 跳转浏览器记载网页
     */
    private void jumpToweb() {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(text));
        startActivity(intent);
    }

    @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) {
                    jumpTocall();
                } else {
                    Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show();
                }
                break;
            case 2:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    jumpTosms();
                } else {
                    Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show();
                }
                break;
            case 3:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    jumpTomail();
                } else {
                    Toast.makeText(this, "你拒绝了这个权限", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值