android 二维码制作,显示到UI,并保存SD卡,拿来就能用!!

简介:

转载请注明出处:王亟亟的大牛之路

现在二维码已经渗透了我们的生活,各种扫码关注啊,扫码下载的,今天上一个根据输入内容生成二维码的功能。

包结构:
这里写图片描述
界面截图:
这里写图片描述

这里写图片描述

功能:输入网址–>生成图片–>显示到Imageview–>储存到本地SD卡中

MainActivity(重要的部分已详细标注,生成的图片也经过测试可用)

public class MainActivity extends Activity {
    ImageView imageview;
    EditText webInput;
    Button MakeImage;
    Bitmap qrImage;
    private  ProgressDialog mLoadingDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webInput=(EditText)findViewById(R.id.webInput);
        imageview=(ImageView)findViewById(R.id.imageview);
        MakeImage=(Button)findViewById(R.id.MakeImage);
        //业务逻辑
        doBusiness();
    }

    public void doBusiness(){
        MakeImage.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //判断是否有输入内容
                if(webInput.getText().toString().equals("")||webInput==null){
                    Toast.makeText(MainActivity.this, "请输入网址", Toast.LENGTH_SHORT).show();
                    return;
                }else{
                    showLoadingDialog("Loading...");
                    //回收bitmap
                        if(null != qrImage && !qrImage.isRecycled()){
                            qrImage.recycle();
                            qrImage = null;
                        }
                          try {
                            qrImage = makeQRImage(webInput.getText().toString(), 600, 600);
                        } catch (WriterException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                          imageview.setImageBitmap(qrImage);
                            //生成图片
                            if(isMountedSDCard()){
                                String filePath =Environment.getExternalStorageDirectory()+ "/MyLive/QRImage/"+"aa"+".jpg";
                                try {
                                    //保存图片
                                    saveAsJPEG(qrImage, filePath);
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                dismissLoadingDialog();
                                Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_LONG).show();
                            }else{
                                Toast.makeText(MainActivity.this, "没有安装SD卡", Toast.LENGTH_LONG).show();
                            }


                }
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    /*显示对话框*/
    public void showLoadingDialog(String msg) {
        if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
            return;
        }
        mLoadingDialog = new ProgressDialog(this);
        mLoadingDialog.setMessage(msg);
        // mLoadingDialog.setOnKeyListener(mOnKeyListener);
        // mLoadingDialog.setCancelable(false);
        mLoadingDialog.show();
    }

    /**
     * 取消加载对话框
     */
    public void dismissLoadingDialog() {
        if (mLoadingDialog != null) {
            mLoadingDialog.dismiss();
        }
    }

    /**
     * 根据指定内容生成自定义宽高的二维码图片 
     * @param content 需要生成二维码的内容
     * @param width 二维码宽度
     * @param height 二维码高度
     * @throws WriterException 生成二维码异常
     */
    public static Bitmap makeQRImage(String content, int width, int height)
            throws WriterException {
        // 判断URL合法性
        if (!isNoBlankAndNoNull(content))
            return null;

        Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 图像数据转换,使用了矩阵转换
        BitMatrix bitMatrix = new QRCodeWriter().encode(content,
                BarcodeFormat.QR_CODE, width, height, hints);
        int[] pixels = new int[width * height];
        // 按照二维码的算法,逐个生成二维码的图片,两个for循环是图片横列扫描的结果
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (bitMatrix.get(x, y))
                    pixels[y * width + x] = 0xff000000;
                else
                    pixels[y * width + x] = 0xffffffff;
            }
        }
        // 生成二维码图片的格式,使用ARGB_8888
        Bitmap bitmap = Bitmap.createBitmap(width, height,
                Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

        return bitmap;
    }

    /**
     * 判断字符串是否非空非null
     * @param strParm 需要判断的字符串
     * @return 真假
     */
    public static boolean isNoBlankAndNoNull(String strParm)
    {
      return ! ( (strParm == null) || (strParm.equals("")));
    }

    /**
     * 指定目录写入文件内容
     * @param filePath 文件路径+文件名
     * @param content 文件内容
     * @throws IOException
     */
    public static void saveAsJPEG(Bitmap bitmap,String filePath)
            throws IOException {
        FileOutputStream fos = null;

        try {
            File file = new File(filePath);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            fos = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100,fos);
            fos.flush();
        } finally {
            if (fos != null) {
                fos.close();
            }
        }
    }

    public static boolean isMountedSDCard() {
        if (Environment.MEDIA_MOUNTED.equals(Environment
                .getExternalStorageState())) {
            return true;
        } else {
            return false;
        }
    }
}

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.qrcodedemo.MainActivity" >

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
                  <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignBottom="@+id/webInput"
                android:layout_alignParentLeft="true"
                android:layout_alignTop="@+id/webInput"
                android:text="输入网址:" 
                android:textSize="16sp"
                android:gravity="bottom"/>

               <EditText
                   android:id="@+id/webInput"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_alignParentTop="true"
                   android:layout_toRightOf="@+id/textView1"
                   android:ems="10" >
                   <requestFocus />
               </EditText>

        </LinearLayout>

            <Button
            android:id="@+id/MakeImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="MakeImage" />
            <ImageView
            android:id="@+id/imageview"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>

        </LinearLayout>
    </ScrollView>
</RelativeLayout>

源码地址:http://yunpan.cn/cd8sknyybpZzE 访问密码 8f62
因为在代码中已经注明,所以下源码看了用即可,不做过多解释用到的JAR包也在源码内

目录
相关文章
|
24天前
|
消息中间件 安全 数据处理
Android为什么不能在子线程更新UI
Android为什么不能在子线程更新UI
26 0
|
3月前
|
Android开发 开发者
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
42 1
|
3月前
|
开发工具 Android开发 开发者
Android UI设计: 解释Android的Nine-Patch图像是什么,它用于什么目的?
Android UI设计: 解释Android的Nine-Patch图像是什么,它用于什么目的?
31 4
|
3月前
|
API Android开发 开发者
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
31 2
|
3月前
|
Android开发 容器
Android UI设计: 什么是View和ViewGroup?
Android UI设计: 什么是View和ViewGroup?
36 0
|
3月前
|
数据可视化 Android开发 容器
Android UI设计: 请解释LinearLayout、RelativeLayout和ConstraintLayout的区别。
Android UI设计: 请解释LinearLayout、RelativeLayout和ConstraintLayout的区别。
93 5
|
12天前
|
编解码 Android开发 UED
安卓UI/UX设计原则:打造引人入胜的用户体验
【4月更文挑战第13天】本文探讨了安卓UI/UX设计的关键原则,包括一致性、简洁性、反馈、清晰性、效率和适应性。一致性要求视觉和行为保持一致,利用系统UI;简洁性减少用户行动,简化导航;反馈需即时且明确;清晰性强调表达清晰,布局有序;效率关注性能优化和任务简化;适应性涉及多设备适配和用户多样性。遵循这些原则,可创建出色应用,提供无缝用户体验。设计应持续迭代,适应技术发展和用户需求。
|
16天前
|
XML 移动开发 Android开发
构建高效安卓应用:采用Jetpack Compose实现动态UI
【4月更文挑战第10天】 在现代移动开发中,用户界面的流畅性和响应性对于应用的成功至关重要。随着技术的不断进步,安卓开发者寻求更加高效和简洁的方式来构建动态且吸引人的UI。本文将深入探讨Jetpack Compose这一革新性技术,它通过声明式编程模型简化了UI构建过程,并提升了性能与跨平台开发的可行性。我们将从基本概念出发,逐步解析如何利用Jetpack Compose来创建具有数据动态绑定能力的安卓应用,同时确保应用的高性能和良好用户体验。
15 0
|
18天前
|
XML Java Android开发
Android之UI基础控件
Android之UI基础控件
|
18天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。