2013-05-07 91 views
4

我将图片从网址保存到sdcard。但在SD卡中图像大小为0。图像是在SD卡中创建的,但现在从url中检索数据并保存。所以它给我的尺寸。将url从网址保存到sdcard

try 
    { 
    URL url = new URL("http://api.androidhive.info/images/sample.jpg"); 
     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 (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()); 
    } 
+1

你应该有互联网许可和写入外部存储。 – 2013-05-07 08:28:29

回答

5

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

我试过并得到totalSize = -1 – user2160008 2013-05-07 08:30:36

+0

我测试模拟器 – user2160008 2013-05-07 08:31:03

+0

检查设备 – 2013-05-07 10:32:41

2

试试这个,这可能会晚,但它会帮助别人。

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

希望这将有助于:-)