Save image from url to sdcard

I am saving the image from the URL to the SD card. But the image size is 0 in sdcard. The image is created in sdcard, but now information is extracted from the url and saved. so it gives me size 0.

try { URL url = new URL("http://api.androidhive.info/images/sample.jpg"); InputStream input = url.openStream(); try { //The sdcard directory eg '/sdcard' can be used directly, or //more safely abstracted with getExternalStorageDirectory() File storagePath = Environment.getExternalStorageDirectory(); OutputStream output = new FileOutputStream (new File(storagePath,username+".png")); try { byte[] buffer = new byte[2048]; int bytesRead = 0; while ((bytesRead = input.read(buffer, 0, buffer.length)) >= 0) { output.write(buffer, 0, bytesRead); } } finally { output.close(); } } finally { input.close(); } } catch(Exception e) { System.out.println("error in sd card "+e.toString()); } 
+4
source share
2 answers

Try this code. He works...

You must have Internet permission and an external storage record.

 try { URL url = new URL("Enter the URL to be downloaded"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); urlConnection.connect(); File SDCardRoot = Environment.getExternalStorageDirectory().getAbsoluteFile(); String filename="downloadedFile.png"; Log.i("Local filename:",""+filename); File file = new File(SDCardRoot,filename); if(file.createNewFile()) { file.createNewFile(); } FileOutputStream fileOutput = new FileOutputStream(file); InputStream inputStream = urlConnection.getInputStream(); int totalSize = urlConnection.getContentLength(); int downloadedSize = 0; byte[] buffer = new byte[1024]; int bufferLength = 0; while ( (bufferLength = inputStream.read(buffer)) > 0 ) { fileOutput.write(buffer, 0, bufferLength); downloadedSize += bufferLength; Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ; } fileOutput.close(); if(downloadedSize==totalSize) filepath=file.getPath(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { filepath=null; e.printStackTrace(); } Log.i("filepath:"," "+filepath) ; return filepath; 
+5
source

Try this, it may be late, but it will help someone.

  private class ImageDownloadAndSave extends AsyncTask<String, Void, Bitmap> { @Override protected Bitmap doInBackground(String... arg0) { downloadImagesToSdCard("",""); return null; } private void downloadImagesToSdCard(String downloadUrl,String imageName) { try { URL url = new URL(img_URL); /* making a directory in sdcard */ String sdCard=Environment.getExternalStorageDirectory().toString(); File myDir = new File(sdCard,"test.jpg"); /* if specified not exist create new */ if(!myDir.exists()) { myDir.mkdir(); Log.v("", "inside mkdir"); } /* checks the file and if it already exist delete */ String fname = imageName; File file = new File (myDir, fname); if (file.exists ()) file.delete (); /* Open a connection */ URLConnection ucon = url.openConnection(); InputStream inputStream = null; HttpURLConnection httpConn = (HttpURLConnection)ucon; httpConn.setRequestMethod("GET"); httpConn.connect(); if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) { inputStream = httpConn.getInputStream(); } FileOutputStream fos = new FileOutputStream(file); int totalSize = httpConn.getContentLength(); int downloadedSize = 0; byte[] buffer = new byte[1024]; int bufferLength = 0; while ( (bufferLength = inputStream.read(buffer)) >0 ) { fos.write(buffer, 0, bufferLength); downloadedSize += bufferLength; Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ; } fos.close(); Log.d("test", "Image Saved in sdcard.."); } catch(IOException io) { io.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } } 

Announce your network operations in AsyncTask as it will load it as a background task. Do not load the network operation into the main thread. After that, either pressing the button or viewing the contents will call this class, for example

 new ImageDownloadAndSave().execute(""); 

And don't forget to add nework permission like:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> 

Hope this helps :-)

+2
source

Source: https://habr.com/ru/post/1479493/


All Articles