Amit
Amit

Reputation: 1184

How can I save an image from a url?

I'm setting an ImageView using setImageBitmap with an external image url. I would like to save the image so it can be used later on even if there is no internet connection. Where and how can I save it?

Upvotes: 4

Views: 36455

Answers (6)

manoellribeiro
manoellribeiro

Reputation: 275

If you are using Retrofit and has a ResponseBody instance that contains the image you want to store, you can use this:

val response: ResponseBody = retrofitService.getImage()
val dir = applicationContext.filesDir // if you are inside you activity scope
val imageFile = File(dir, "image.png")
val fileOutputStream = FileOutputStream(imageFile)
fileOutputStream.write(response.bytes())
fileOutputStream.close()

Using this you don't need to ask for permissions and neither convert your image to bitmap first.

Upvotes: 0

Kishan Solanki
Kishan Solanki

Reputation: 14618

If you are using Kotlin and Glide in your app then this is for you:

Glide.with(this)
                .asBitmap()
                .load(imageURL)
                .into(object : SimpleTarget<Bitmap>(1920, 1080) {
                    override fun onResourceReady(bitmap: Bitmap, transition: Transition<in Bitmap>?) {
                        saveImage(bitmap)
                    }
                })

and this is that function

internal fun saveImage(image: Bitmap) {
    val savedImagePath: String

    val imageFileName = System.currentTimeMillis().toString() + ".jpg"
    val storageDir = File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES).toString() + "/Folder Name")
    var success = true
    if (!storageDir.exists()) {
        success = storageDir.mkdirs()
    }
    if (success) {
        val imageFile = File(storageDir, imageFileName)
        savedImagePath = imageFile.absolutePath
        try {
            val fOut = FileOutputStream(imageFile)
            image.compress(Bitmap.CompressFormat.JPEG, 100, fOut)
            fOut.close()
        } catch (e: Exception) {
            e.printStackTrace()
        }

        galleryAddPic(savedImagePath)
    }
}


private fun galleryAddPic(imagePath: String) {
    val mediaScanIntent = Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE)
    val f = File(imagePath)
    val contentUri = FileProvider.getUriForFile(applicationContext, packageName, f)
    mediaScanIntent.data = contentUri
    sendBroadcast(mediaScanIntent)
}

galleryAddPic() is used to see the image in a phone gallery.

Note: now if you face file uri exception then this can help you.

Upvotes: 1

Aklesh Singh
Aklesh Singh

Reputation: 973

May be its will help someone like me one day

 new SaveImage().execute(mViewPager.getCurrentItem());//calling function

private void saveImage(int currentItem) {
    String stringUrl = Site.BASE_URL + "socialengine/" + allImages.get(currentItem).getMaster();
    Utils.debugger(TAG, stringUrl);

    HttpURLConnection urlConnection = null;
    try {
        URL url = new URL(stringUrl);
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);
        urlConnection.connect();
        File sdCardRoot = Environment.getExternalStorageDirectory().getAbsoluteFile();

        String fileName = stringUrl.substring(stringUrl.lastIndexOf('/') + 1, stringUrl.length());
        String fileNameWithoutExtn = fileName.substring(0, fileName.lastIndexOf('.'));

        File imgFile = new File(sdCardRoot, "IMG" + System.currentTimeMillis() / 100 + fileName);
        if (!sdCardRoot.exists()) {
            imgFile.createNewFile();
        }

        InputStream inputStream = urlConnection.getInputStream();
        int totalSize = urlConnection.getContentLength();
        FileOutputStream outPut = new FileOutputStream(imgFile);

        int downloadedSize = 0;
        byte[] buffer = new byte[2024];
        int bufferLength = 0;
        while ((bufferLength = inputStream.read(buffer)) > 0) {
            outPut.write(buffer, 0, bufferLength);
            downloadedSize += bufferLength;
            Utils.debugger("Progress:", "downloadedSize:" + Math.abs(downloadedSize*100/totalSize));
        }
        outPut.close();
        //if (downloadedSize == totalSize);
            //Toast.makeText(context, "Downloaded" + imgFile.getPath(), Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

 private class SaveImage extends AsyncTask<Integer, Void, String> {

    @Override
    protected String doInBackground(Integer... strings) {
        saveImage(strings[0]);
        return "saved";
    }

    @Override
    protected void onPostExecute(String s) {
        Toast.makeText(context, "" + s, Toast.LENGTH_SHORT).show();
    }
}

Upvotes: 0

Sarim Sidd
Sarim Sidd

Reputation: 2176

You have to save it in SD card or in your package data, because on runtime you only have access to these. To do that this is a good example

URL url = new URL ("file://some/path/anImage.png");
InputStream input = url.openStream();
try {
//The sdcard directory e.g. '/sdcard' can be used directly, or 
//more safely abstracted with getExternalStorageDirectory()
File storagePath = Environment.getExternalStorageDirectory();
OutputStream output = new FileOutputStream (storagePath + "/myImage.png");
try {
    byte[] buffer = new byte[aReasonableSize];
    int bytesRead = 0;
    while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) {
        output.write(buffer, 0, bytesRead);
    }
} finally {
    output.close();
}
} finally {
input.close();
}

Source : How do I transfer an image from its URL to the SD card?

Upvotes: 5

coderplus
coderplus

Reputation: 5913

URL imageurl = new URL("http://mysite.com/me.jpg"); 
Bitmap bitmap = BitmapFactory.decodeStream(imageurl.openConnection().getInputStream()); 

This code will help you in generating the bitmap from the image url.

This question answers the second part.

Upvotes: 10

MAC
MAC

Reputation: 15847

you can save image in sdcard and you can use that image in future without internet.

see this tutorial will show how to store image and again read it.

Hope this will help you.....!

Upvotes: 0

Related Questions