如何通过URL将图像下载到内部存储器?

时间:2019-01-21 09:25:33

标签: android firebase-storage

我想下载我上传到Firebase的图像。我得到了URL,并能够将它们直接加载到所需的ImageView中。但是我想将它们下载到内部存储中的所需路径中。

我已经使用了毕加索,但是它对我不起作用,因为在使用(new Target())时出现以下错误,这是我将毕加索与Target一起使用时出现的错误

enter image description here

下面是毕加索的代码

Picasso.get()
                .load(downloadUrl)
                .into(new Target() {
                          @Override
                          public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                              try {

                                  String root = Environment.getExternalStorageDirectory().toString();
                                  File myDir = new File(root + "/yourDirectory");

                                  if (!myDir.exists()) {
                                      myDir.mkdirs();
                                  }

                                  String name = new Date().toString() + ".jpg";
                                  myDir = new File(myDir, name);
                                  FileOutputStream out = new FileOutputStream(myDir);
                                  bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);

                                  out.flush();
                                  out.close();
                              } catch(Exception e){
                                  // some action
                              }
                          }

                          @Override
                          public void onBitmapFailed(Drawable errorDrawable) {

                          //Some Action;
                          }

                          @Override
                          public void onPrepareLoad(Drawable placeHolderDrawable) {
                            //Some Action;
                          }
                      }
                );

我已经在文档中搜索了,但是没有用。请尽快通知我。如果有人有正确答案。在此先感谢

2 个答案:

答案 0 :(得分:1)

第一:实施Taget类方法以清除错误

:您的代码会抛出此exception java.io.FileNotFoundException 因为Date对象的默认格式类似于Mon Jan 21 12:10:23 GMT+02:00 2019 并且您无法创建名称包含冒号

的文件

第三次::检查是否在android.permission.WRITE_EXTERNAL_STORAGE中添加了androidManiefest.xml权限,并且需要在棉花糖中使用运行时权限

答案 1 :(得分:0)

注意:要消除错误,您必须实现Target类的方法。

对于下载图像,您可以从链接中找到解决方案

https://www.codexpedia.com/android/android-download-and-save-image-through-picasso/

Picasso.with(this).load(anImageUrl).into(picassoImageTarget(getApplicationContext(), "imageDir", "my_image.jpeg"));

方法

private Target picassoImageTarget(Context context, final String imageDir, final String imageName) {
    Log.d("picassoImageTarget", " picassoImageTarget");
    ContextWrapper cw = new ContextWrapper(context);
    final File directory = cw.getDir(imageDir, Context.MODE_PRIVATE); // path to /data/data/yourapp/app_imageDir
    return new Target() {
        @Override
        public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    final File myImageFile = new File(directory, imageName); // Create image file
                    FileOutputStream fos = null;
                    try {
                        fos = new FileOutputStream(myImageFile);
                        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            fos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                   Log.i("image", "image saved to >>>" + myImageFile.getAbsolutePath());

                }
            }).start();
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
        }
        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            if (placeHolderDrawable != null) {}
        }
    };
}