无法使用Volley从Json响应中保存图像

时间:2018-04-02 07:08:45

标签: android android-volley

保存来自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);

2 个答案:

答案 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);
        }