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; 

该图像succuessfully保存到SD卡,但到达createFromPath()行时失败。 我不明白为什么它会保存到目的地,但不加载它….

试试这个code.It工程…

 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卡上创build一个子目录,使用:

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

创build一个子目录“/ 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中声明你的networking操作,因为它会把它作为后台任务加载。 不要在主线程上加载networking操作。 之后,无论是在button点击或在内容视图中调用这个类

  new ImageDownloadAndSave().execute(""); 

不要忘记添加nework权限,如下所示:

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

希望这可能有助于某人:-)

我相信这是失败的,因为你正在写一个压缩版本的位图到输出stream,应该用BitmapFactory.decodeStream()加载。 快速浏览一下这个文档。

如果你需要一个DrawabledecodeStream()返回一个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) { } } );