代码之家  ›  专栏  ›  技术社区  ›  Antonio314

无法保存URL中的图像。安卓

  •  0
  • Antonio314  · 技术社区  · 10 年前

    首先,对不起我的英语不好,其次,我有一个“小”问题。 我测试了StackOverFlow中的许多代码,但我仍然遇到同样的问题。

    我正在尝试从URL下载一些图像。我有一个ExpandableListView,我使用一个名为Downloadusers的类来下载有关用户的所有信息。 在本课程中,我获取用户的照片URL,并使用以下代码下载图像:

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

    我还验证了URL是否正确,并已加载到浏览器中。 使用Log.i(“文件路径:”,“”+文件路径);我可以看到文件路径是正确的,所以我认为图像是正确下载的,但不是,图像文件是损坏的文件,所以当我将图像加载到ImageView中时,我遇到了NullPointException,因为由于图像损坏,bMap readed为空。

    我拥有所有权限:Internet、写入和读取外部存储以及手机状态。

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

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

    3 回复  |  直到 10 年前
        1
  •  0
  •   Adem Ä°lhan    10 年前

    这是我的下载方法。您将把图像下载到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);
    
        2
  •  0
  •   Antonio314    10 年前

    我用图书馆解决了我的问题 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上,并在图像视图中显示,而不会出现问题。

    谢谢大家。

        3
  •  0
  •   Amos M. Carpenter leergou    9 年前

    我也有同样的问题,但我能够通过设置

    urlConnection.setDoOutput(false);
    

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