无法保存URL中的图像。 Android的

时间:2014-08-23 14:28:40

标签: android image url download corrupt

首先,抱歉我的英语不好,其次,我有一个"小"问题。 我从StackOverFlow测试了很多代码,但我继续遇到同样的问题。

我试图从网址下载一些图片。我有一个ExpandableListView,我使用一个名为Downloadusers的类来下载有关用户的所有信息。 在本课程中,我获得用户的照片网址,然后使用以下代码下载图片:

 private void downloadFile(String url) {

    String filepath = null;
    try
    {   
      URL nurl = new URL(url);
      HttpURLConnection urlConnection = (HttpURLConnection) nurl.openConnection();
      urlConnection.setRequestMethod("GET");
      urlConnection.setDoOutput(true);                   
      urlConnection.connect();                  
      File SDCardRoot = getExternalFilesDir(null);
      String filename = url.substring(url.lastIndexOf('/') + 1);  
      Log.i("Local filename:",""+filename+"  SDCardRoot: "+SDCardRoot.toString());
      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[PHOTO_FILE_MAX_SIZE];
      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);
}

我还验证了网址是否正确,我已在浏览器中加载。 使用Log.i("文件路径:","" +文件路径);我可以看到文件路径是正确的,所以我认为图像是正确下载但是没有,图像文件是损坏的文件,所以当我将图像加载到我的ImageView时,我有一个NullPointException,因为由于图像损坏,bMap readed为null。

我拥有所有权限:互联网,写入和读取外部存储和手机状态。

我也尝试使用AsyncTask下载图像,但我遇到了同样的问题。

有人知道我的问题是什么? 感谢。

3 个答案:

答案 0 :(得分:0)

这是我的下载方法。您将下载图像到SDCARD。您可以通过DDMS Perspective查看是否下载了图像。

public void download(String Url) throws IOException {
    URL url = new URL (Url);
    InputStream input = url.openStream();
    try {
        File storagePath = new File(Environment.getExternalStorageDirectory());

        OutputStream output = new FileOutputStream (new File(storagePath, 'myImage.jpg'));
        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();
    }
  }

此代码段用于在ImageView中显示下载的图像。

ImageView image = (ImageView) findViewById(R.id.image);
Bitmap bitmap = BitmapFactory.decodeFile(Environment
.getExternalStorageDirectory() + "myImage.jpg");
image.setImageBitmap(bitmap);

答案 1 :(得分:0)

我使用库nostra13 "universal-image-loader-1.9.2.jar"解决了我的问题。我的代码现在是:

    // If the user photo exists and is public, download and show it. 
    if (Utils.connectionAvailable(activity)
            && (photoFileName != null) && !photoFileName.equals("")
            && !photoFileName.equals(Constants.NULL_VALUE)) {

        // Create options. Setting caché = true (default = false)
        DisplayImageOptions options = new DisplayImageOptions.Builder()
                            .cacheInMemory(true)
                            .build();

         // Create global configuration and initialize ImageLoader 
         // with this configuration
        ImageLoaderConfiguration config = new ImageLoaderConfiguration
                                 .Builder(activity.getApplicationContext()) 
                                 .defaultDisplayImageOptions(options)
                                 .build();

        ImageLoader.getInstance().init(config);

        // Load image, decode it to Bitmap and display Bitmap in ImageView 
        // (or any other view 
        // which implements ImageAware interface)
        ImageLoader.getInstance().displayImage(photoFileName, image);
   }

使用该代码,我可以在caché上加载图像并在我的imageview中显示没有问题。

感谢所有人。

答案 2 :(得分:0)

我遇到了同样的问题,但我能够通过设置

来解决它
urlConnection.setDoOutput(false);

它有效,但我不知道为什么。