1.从相册选择图片到view上展示,
(1)实际上是使用Intent打开相册的activity,
(2)使用onActivityResult读取用户选中的图片(Uri),
(3)根据Uri读取ContentProvider,获取到图片在文件系统中的path,
(4)再用Glide根据path显示图片。
2.长按view保存到本地,
(1)将view转成bitmap,
(2)使用bitmap.compress保存到文件流中(BufferedOutputStream,FileOutputStream),
(3)保存之后需要通知相册刷新sd卡,及时展示出来。
3.记住一定要申请读写存储权限
1.从相册选择图片到view展示
(1)使用intent打开相册的activity
Intent intent = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// data指MediaStore.Images.Media.EXTERNAL_CONTENT_URI,指示打开的页面
// type="image/*"可能是用来筛选页面中符合type的数据
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*")
startActivityForResult(intent,1000);
// 这个1000在onActivityForResult里会用到
(2)在onActivityResult获取用户选中的图片
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1000) {
if (resultCode == RESULT_OK && data != null) {
// 选中的uri
Uri selectedImageUri = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};// _data
if (selectedImageUri != null) {
Cursor cursor = getContentResolver().query(selectedImageUri,filePathColumn,
null,null);
// selectedImageUri:指代查询的路径
// filePathColumn:指代查询的表中相应的列名,为null表明查询所有列
if (cursor != null) {
cursor.moveToFirst();// 指代第一行
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);//根据查询列名获取列index
String dataToIndex = cursor.getString(columnIndex);// 图片对应的path
if (!dataToIndex.isEmpty()) {
Glide.with(this)
.load(dataToIndex)
.into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
((ImageView)findViewById(R.id.image_holder)).setImageDrawable(resource);
}
})
}
}
}
}
}
}
2.长按view保存到本地
(1)保存view到bitmap
// 将bitmap转成canvas,然后在canvas基础上绘制view
private Bitmap turnViewToBitmap(View view) {
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),view.getHeight());
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
return bitmap;
}
(2)将bitmap保存到相册
private boolean saveBitmapToLocal(Bitmap bitmap) {
final String sdStatus = Environment.getExternalStorageStatus();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
return false;
}
FileOutputStream fileOutputStream = null;
BufferedOutputStream buffedOutputStream = null;
File fileDir = new File(FILE_DIR);
if (!fileDir.isExists()) {
fileDir.mkDirs();
}
File file = new File(fileDir, fileName);
try {
fileOutputStream = new FileOutputStream(file);
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
// Bitmap.CompressFormat.PNG:编码格式
// 100:压缩系数,100表示不压缩
// bufferedOutputStream:将数据输出到bufferedOutputStream
bitmap.compress(Bitmap.CompressFormat.PNG,100,bufferedOutputStream);
} catch (FileNotFoundException e) {
Log.e(TAG,"file not found:"+e.getMessage());
return false;
} finally {
try {
if (bufferedOutputStream != null) {
bufferedOutputStream.close();
}
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
Log.e(TAG,"io error:"+e.getMessage());
return false;
}
}
refreshSDCard(file);
}
(3)通知系统刷新sd卡
https://segmentfault.com/a/1190000014593444
private static void refreshSDCard(File file) {
if (Build.VERSION.SDK_INT >= 19) {
/*new MediaScannerConnection().scanFile(ApplicationContextHolder.getContext(),
new String[]{Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM).getPath()});*/
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(file));
ApplicationContextHolder.getContext().sendBroadcast(intent);
}
}