2011-02-02 227 views
11

我想将URL中的图像保存到SD卡中(以备将来使用),然后从SD卡上加载该图像以将其用作Google地图的可绘制覆盖图。Android - 将URL上的图像保存到SD卡上

下面是函数的节省部分:开始的createFromPath()线时

//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卡succuessfully但失败。我不明白为什么它会保存到目的地,但不加载它...

+0

你会得到什么错误? – Cristian 2011-02-02 13:45:32

+0

您是否尝试使用createFromPath加载现有图像? – Ankit 2011-02-02 13:47:07

+0

它位于try-catch语句中,如果失败,则将其设置为null。我还没有测试过其他图片。我正在使用仿真器 – Jamie 2011-02-02 13:57:23

回答

1

我相信这是失败的,因为你正在写输出流的压缩版本的位图,应该加载与BitmapFactory.decodeStream()。在这个文件上有一个quick look

如果您需要DrawabledecodeStream()返回Bitmap),只需拨打Drawable d = new BitmapDrawable(bitmap)即可。

5

尝试此代码以将图像从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(); 

要创建一个子目录“/ SD卡/墙纸/”。

希望它能帮助你。

享受。 :)

1

试试这个code..It工作正常

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" /> 
28

试试这个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; 
20

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

} 
3

我也面临同样的问题,并解决我的这个。试试这个

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

而且不要忘记将联播网,允许添加为:

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

希望这可以帮助别人:-)

1

试试这个...一个简单的方法来完成任务。

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