Android – Сохранить изображение с URL на SD-карту

Я хочу сохранить изображение с URL-адреса на SD-карту (для дальнейшего использования), а затем загрузить это изображение с SD-карты, чтобы использовать его в качестве нарисованного наложения для карт Google.

Вот раздел сохранения функции:

//SAVE TO FILE String filepath = Environment.getExternalStorageDirectory().getAbsolutePath(); String extraPath = "/Map-"+RowNumber+"-"+ColNumber+".png"; filepath += extraPath; FileOutputStream fos = null; fos = new FileOutputStream(filepath); bmImg.compress(CompressFormat.PNG, 75, fos); //LOAD IMAGE FROM FILE Drawable d = Drawable.createFromPath(filepath); return d; 

Изображение с успехом сохраняется на SD-карте, но не удается получить createFromPath() к createFromPath() . Я не понимаю, почему он сэкономит на этом месте, но не загрузится с него ….

Попробуйте этот код. Он работает …

 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; 

DownloadManager делает все это для вас.

 public void downloadFile(String uRl) { File direct = new File(Environment.getExternalStorageDirectory() + "/AnhsirkDasarp"); if (!direct.exists()) { direct.mkdirs(); } DownloadManager mgr = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE); Uri downloadUri = Uri.parse(uRl); DownloadManager.Request request = new DownloadManager.Request( downloadUri); request.setAllowedNetworkTypes( DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE) .setAllowedOverRoaming(false).setTitle("Demo") .setDescription("Something useful. No, really.") .setDestinationInExternalPublicDir("/AnhsirkDasarpFiles", "fileName.jpg"); mgr.enqueue(request); } 

Попробуйте этот код, чтобы сохранить изображение с URL-адреса на SDCard.

 URL url = new URL ("file://some/path/anImage.png"); InputStream input = url.openStream(); try { 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(); } 

Если вы хотите создать подкаталог на SD-карте, используйте:

 File storagePath = new File(Environment.getExternalStorageDirectory(),"Wallpaper"); storagePath.mkdirs(); 

Чтобы создать подкаталог «/ sdcard / Wallpaper /».

Надеюсь, это поможет вам.

Наслаждаться. 🙂

Я также столкнулся с той же проблемой и разрешил эту проблему. Попробуй это

 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(); } } } 

Объявите свои сетевые операции в AsyncTask, поскольку он загрузит его в качестве фоновой задачи. Не загружайте сетевую операцию в основной поток. После этого либо нажатием кнопки, либо в режиме просмотра содержимого вызовите этот класс, как

  new ImageDownloadAndSave().execute(""); 

И не забудьте добавить разрешение nework как:

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

Надеюсь, это может помочь кому-то 🙂

Я считаю, что это неудачно, потому что вы пишете сжатую версию растрового изображения в выходной поток, который должен быть загружен с помощью BitmapFactory.decodeStream() . Внимательно ознакомьтесь с документацией по этому вопросу.

Если вам нужен Drawable ( decodeStream() возвращает Bitmap ), просто вызовите Drawable d = new BitmapDrawable(bitmap) .

Попробуйте этот код. Он отлично работает

 public static Bitmap loadImageFromUrl(String url) { URL m; InputStream i = null; BufferedInputStream bis = null; ByteArrayOutputStream out =null; try { m = new URL(url); i = (InputStream) m.getContent(); bis = new BufferedInputStream(i,1024 * 8); out = new ByteArrayOutputStream(); int len=0; byte[] buffer = new byte[1024]; while((len = bis.read(buffer)) != -1){ out.write(buffer, 0, len); } out.close(); bis.close(); } catch (MalformedURLException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } byte[] data = out.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); //Drawable d = Drawable.createFromStream(i, "src"); return bitmap; } 

И сохранить растровое изображение в каталог

 ByteArrayOutputStream bytes = new ByteArrayOutputStream(); _bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bytes); //you can create a new file name "test.jpg" in sdcard folder. File f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.jpg") f.createNewFile(); //write the bytes in file FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); // remember close de FileOutput fo.close(); 

И не забудьте добавить разрешение на манифест

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

Попробуйте это … Простой способ выполнить задание.

 Picasso.with(getActivity()) .load(url) .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) { } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { } } );