数据库存储图片
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;
}
}
});