保存来自ImageView
的图片在Android中不起作用。图片加载来自JSON
的Volley。我想将该图像保存在图库中,但在某些设备上,此代码无效。
BitmapDrawable draw = (BitmapDrawable) thumbnail.getDrawable();
Bitmap bitmap = draw.getBitmap();
FileOutputStream outStream = null;
File dir = new File(Environment.getExternalStorageDirectory() + "");
dir.mkdirs();
String fileName = String.format("%d.jpg", System.currentTimeMillis());
File outFile = new File(dir, fileName);
try {
outStream = new FileOutputStream(outFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
try {
outStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
Toast.makeText(JobsDetail.this, "Download Successfully", Toas.LENGTH_SHORT).show();
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(Uri.fromFile(dir));
sendBroadcast(intent);
答案 0 :(得分:1)
只需使用此功能即可直接从Image Url下载
// DownloadImage AsyncTask
private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Bitmap doInBackground(String... URL) {
String imageURL = URL[0];
Bitmap bitmap = null;
try {
// Download Image from URL
InputStream input = new java.net.URL(imageURL).openStream();
// Decode Bitmap
bitmap = BitmapFactory.decodeStream(input);
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
if (result != null) {
progressBar.setVisibility(View.GONE);
File destination = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".jpg");
try {
destination.createNewFile();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
result.compress(Bitmap.CompressFormat.PNG, 0 /*ignored for PNG*/, bos);
byte[] bitmapdata = bos.toByteArray();
FileOutputStream fos = new FileOutputStream(destination);
fos.write(bitmapdata);
fos.flush();
fos.close();
LicenseFrontFile = destination;
} catch (IOException e) {
e.printStackTrace();
}
}
}
// Set the bitmap into ImageView
//image.setImageBitmap(result);
// Close progressdialog
}
要使用,请按此方式调用
new DownloadImage().execute(image_url);
在清单中添加写入权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Marshmallow或以上设备的运行时延迟
答案 1 :(得分:0)
创建一个类SaveImageHelper代码在
下面public class SaveImageHelper implements Target {
private Context context;
private WeakReference<AlertDialog> mDialog;
private WeakReference<ContentResolver> contentResolverWeakReference;
private String name;
private String desc;
public SaveImageHelper(Context context,AlertDialog alertDialog, ContentResolver contentResolver, String name, String desc) {
this.context = context;
this.mDialog = new WeakReference<AlertDialog>(alertDialog);
this.contentResolverWeakReference = new WeakReference<ContentResolver>(contentResolver);
this.name = name;
this.desc = desc;
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
ContentResolver r = contentResolverWeakReference.get();
AlertDialog dialog = mDialog.get();
if(r != null)
MediaStore.Images.Media.insertImage(r,bitmap,name,desc);
dialog.dismiss();
Toast.makeText(context, "Image Download Successfully...", Toast.LENGTH_SHORT).show();
//Open Gallery After Download
//Intent intent = new Intent();
//intent.setType("image/*");
// intent.setAction(Intent.ACTION_GET_CONTENT);
// context.startActivity(Intent.createChooser(intent,"SELECT PICTURE"));
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
}
并通过按钮单击
在另一个类/ Activity中使用它btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ActivityCompat.checkSelfPermission(JobsDetail.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
{
Toast.makeText(JobsDetail.this, "You Should Grant Permission..", Toast.LENGTH_SHORT).show();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
}, PERMISSION_REQUEST_CODE);
}
return;
}
else{
AlertDialog dialog = new SpotsDialog(JobsDetail.this);
dialog.show();
dialog.setMessage("Downloading....");
String filename = UUID.randomUUID().toString()+".jpg";
Picasso.with(getBaseContext())
.load(imageUrl)
.into(new SaveImageHelper(getBaseContext(),
dialog, getApplicationContext().getContentResolver(),
filename,"Image Descp"));
}
还在oncreate中设置权限以访问设备中的文件和图像
if(ActivityCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
}, PERMISSION_REQUEST_CODE);
}