Android扫描二维码,生成二维码

该博客介绍了在Android平台上实现二维码的生成和扫描功能。通过使用第三方库ZXing,可以将字符串内容编码为二维码,并展示在应用中。同时,也提到了当前存在的问题,即无法将图片作为二维码内容以及不能扫描自己生成的二维码。源代码展示了相关布局和关键功能的实现,包括权限申请和活动逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

亲测正常使用,直接复制粘贴即可正常运行

有以下两个小问题还没有解决:

  1. 不能将图片作为二维码内容,只能将字符串内容作为二维码内容,
  2. 不能扫描自己产出的二维码。。。有知道如何解决的大佬求告知。

界面

在这里插入图片描述

不多做介绍了直接上代码,Activity部分的爆红 自己加比较好,快捷键( Alt + Enter )

在这里插入图片描述

 /*添加二维码依赖*/
    implementation 'com.github.yuzhiqiang1993:zxing:2.2.5

在这里插入图片描述

maven { url 'https://jitpack.io' }

在这里插入图片描述

 <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

。。。。。。。。。。。。。。。。。。。。。。。
xml 布局文件
。。。。。。。。。。。。。。。。。。。。。。。。。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_qr_code"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击扫描二维码"
        android:textSize="32dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:background="@android:color/holo_blue_dark"
        android:textColor="@android:color/white"
        android:gravity="center"/>

    <EditText
        android:id="@+id/et_content"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:hint="输入二维码内容"/>

    <TextView
        android:id="@+id/tv_qr_code1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击生成二维码"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:background="@android:color/holo_blue_dark"
        android:textColor="@android:color/white"
        android:textSize="32dp"
        android:gravity="center"/>

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

。。。。。。。。。。。。。。。。。。.。。。。。
Activity 布局
。。。。.。。。。。。。。。。。。。。。。。。

public class MainActivity extends AppCompatActivity {

    private  static  final  int REQUEST_CODE_SCAN = 1;

    private TextView tv_qr_code;
    private TextView tv_qr_code1;
    private ImageView iv;

    /*动态申请权限操作*/
    private boolean isPermissionRequested = false;
    private EditText et_content;

    public void requestPermission() {
        if (Build.VERSION.SDK_INT >= 23 && !isPermissionRequested) {
            isPermissionRequested = true;
            ArrayList<String> permissionsList = new ArrayList<>();
            String[] permissions = {//在这里加入你要使用的权限
                    Manifest.permission.CAMERA,
                    Manifest.permission.READ_EXTERNAL_STORAGE
            };

            for (String perm : permissions) {
                if (PackageManager.PERMISSION_GRANTED != checkSelfPermission(perm)) {
                    permissionsList.add(perm);
                    // 进入这里代表没有权限.
                }
            }

            if (!permissionsList.isEmpty()) {
                String[] strings = new String[permissionsList.size()];
                requestPermissions(permissionsList.toArray(strings), 0);
            }
        }
    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestPermission();//动态权限申请操作
        findView();
        initData();
    }

    private void findView() {
        tv_qr_code = findViewById(R.id.tv_qr_code);
        iv = findViewById(R.id.iv);
        et_content = findViewById(R.id.et_content);
        tv_qr_code1 = findViewById(R.id.tv_qr_code1);

    }

    private void initData() {

        tv_qr_code.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
                startActivityForResult(intent, REQUEST_CODE_SCAN);
            }
        });


        tv_qr_code1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             //   String icon = String.valueOf(R.mipmap.imagea);
                String str = et_content.getText().toString();//设置二维码内容,目前只支持字符串数据,不支持将图片设置为内容
                Bitmap logo = BitmapFactory.decodeResource(getResources(), R.mipmap.imagea); //设置二维码图标
                /*
                 * contentEtString:字符串内容
                 * w:图片的宽
                 * h:图片的高
                 * logo:不需要logo的话直接传null
                 * */
                Bitmap bitmap = CodeCreator.createQRCode(str, 400, 400, logo);
                iv.setImageBitmap(bitmap);
            }
        });


    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 扫描二维码/条码回传
        if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
            if (data != null) {
                String content = data.getStringExtra(Constant.CODED_CONTENT);
                tv_qr_code.setText("扫描结果为:" + content);
            }
        }
    }

    //图片转化为String类型
    public static String convertIconToString(Bitmap bitmap) {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();// outputstream
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        byte[] appicon = baos.toByteArray();// 转为byte数组
        return Base64.encodeToString(appicon, Base64.DEFAULT);

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值