从URL保存图片到SD卡

4
我正在将图片从URL保存到SD卡上。但是在SD卡上,图片大小为0。尽管已经在SD卡上创建了图片,但是现在无法从URL检索数据并保存。因此,它给我返回了0大小的图片。
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
你应该拥有互联网的权限和写入外部存储的权限。 - Nirav Ranpara
2个回答

5

尝试这段代码,它能正常工作...

您需要拥有互联网访问权限和写外部存储的权限。

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;

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

希望这可以帮助:-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接