Android数据库存取图片

数据库存储图片

1、首先需要导入依赖

implementation 'pub.devrel:easypermissions:3.0.0'

2、在AndroidManifest.xml导入允许访问内置SD卡的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3、申请获取存储权限

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //将返回结果给EasyPermissions
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }
    public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
        // 允许(可省略不写)
        Toast.makeText(this, "允许", Toast.LENGTH_SHORT).show();
    }
    public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
        // 禁止
        Toast.makeText(this, "禁止", Toast.LENGTH_SHORT).show();
        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
            new AppSettingsDialog.Builder(this).build().show();
        }
    }
    public static final int RC_READ_EXTERNAL_STORAGE = 1;

4、设置点击事件

        findViewById(R.id.img_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE};
                if(EasyPermissions.hasPermissions(IncreaseActivity.this,perms)){
                    //打开相册
                    Intent intent = new  Intent(Intent.ACTION_PICK);
                    //指定格式为图片
                    intent.setType("image/*");
                    startActivityForResult(intent, REQUEST_IMAGE_OPEN);
                }else{
                    Toast.makeText(IncreaseActivity.this, "没有权限,现在去获取。", Toast.LENGTH_SHORT).show();
                    EasyPermissions.requestPermissions(IncreaseActivity.this,"申请存储权限",RC_READ_EXTERNAL_STORAGE,perms);

                }

            }
        });

5、将选择的图片进行转换并显示

byte[] imgByte; 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //将选择的图片进行显示
        if(requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK &&data !=null){
            Uri uris;
            uris = data.getData();
            Bitmap bitmap = null;
            //Uri转换为Bitmap
            try {
                bitmap = getBitmapFromUri(uris);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            imgIn.setVisibility(View.VISIBLE);
            imgIn.setImageBitmap(bitmap); //ImageView显示图片
            imgByte = bitmapToBytes(bitmap);
        }
    }

6、Bitmap转换byte[]方法

    public byte[] bitmapToBytes(Bitmap bitmap){
        if(null != bitmap){
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);//图片压缩这里建议使用JPEG格式,50是压缩的质量
            return baos.toByteArray();
        }else{
            Toast.makeText(IncreaseActivity.this,"空空空",Toast.LENGTH_SHORT).show();
            return null;
        }
    }

7、存入数据库(数据库存储图的字段类型使用BLOB类型),然后把imgByte存进去就好了,Android数据库增删改查还不会的可以参考我前边发的文章。

从数据库取图片并使用ListView显示

        List<News> newsList= mySQLite.selectallNews();//调用查询所有方法
        if(newsList!=null){
            List<HashMap<String, Object>> data=new ArrayList<>();
            for(News news : newsList){
                HashMap<String,Object> item=new HashMap<String,Object>();
                item.put("title",news.getTitle());
                item.put("time",news.getTime());
                byte[] b=news.getImages(); 
                if(b!=null){
                    bitmaps = BitmapFactory.decodeByteArray(b, 0, b.length);
                    item.put("images",bitmaps);
                }
                data.add(item);
            }

            Collections.reverse(data);
            SimpleAdapter simpleAdapter=new SimpleAdapter(this, data,R.layout.item_layout_new,
                    new String[]{"title","time","images"},
                    new int[]{R.id.title,R.id.tv_time,R.id.item_img});
//            itemImg.setImageBitmap(bitmaps);
			//listview不能直接显示从库里取出的图片,需要使用setViewBinder进行处理
            simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() {
                @Override
                public boolean setViewValue(View view, Object o, String s) {
                    if(view instanceof ImageView && o instanceof Bitmap){
                        ImageView imageView = (ImageView) view;
                        //缩略图
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        Bitmap bo = (Bitmap) o;
                        //压缩图片建议质量越小越好,太大会溢出崩溃
                        bo.compress(Bitmap.CompressFormat.JPEG, 10, baos);
                        byte[] k = baos.toByteArray();
                        Bitmap bos=BitmapFactory.decodeByteArray(k,0,k.length);
                        imageView.setImageBitmap(bos);
                        return true;
                    }else{
                        return false;
                    }
                }
            });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xx080

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值