2011-04-20 272 views
1

我有一個代碼從網站下載圖像並將其保存在SD卡上。 當我由於某種原因發送2個網址時,它只下載第一張圖片2次,並將它們與第二張圖片名稱一起保存,因此如果網站上有image1和image2,代碼將只下載image1兩次並保存SD卡作爲image2可以請別人告訴我我做錯了什麼?android將圖像保存兩次到SD卡

public String getLocalLink(String image_URL, String imageName){ 
     /** This is what we do with this method: 
     * Go online, according to the link, get the content, call the method to save. 
     */ 

     ImageLink = image_URL; 
     URL ImageLinkURL; 

     try { 
      ImageLinkURL = new URL(ImageLink); 
      //URL url  = new URL(strURL); 
      if (!hasExternalStoragePublicPicture(imageName)) { 
       isImage = false; 
       new DownloadImageTask().execute(ImageLinkURL); 
       Log.v("log_tag", "if"); 
       isImage = true; 
       File sdImageMainDirectory = new File(Environment 
         .getExternalStorageDirectory(), getResources() 
         .getString(R.string.directory)); 
       sdImageMainDirectory.mkdirs(); 
       File file = new File(sdImageMainDirectory, imageName); 
       Log.v("log_tag", "Directory created"); 
      } 

     } catch (MalformedURLException e) { 
      Log.v(TAG, e.toString()); 
     } 
     return ("/sdcard/Hanud/」+imageName+".jpg"); 

    } 


    private class DownloadImageTask extends AsyncTask<URL, Integer, Bitmap> { 
     // This class definition states that DownloadImageTask will take String 
     // parameters, publish Integer progress updates, and return a Bitmap 
     protected Bitmap doInBackground(URL... paths) { 
      URL url; 
      try { 
       url = paths[0]; 
       HttpURLConnection connection = (HttpURLConnection) url 
         .openConnection(); 
       int length = connection.getContentLength(); 
       InputStream is = (InputStream) url.getContent(); 
       byte[] imageData = new byte[length]; 
       int buffersize = (int) Math.ceil(length/(double) 100); 
       int downloaded = 0; 
       int read; 
       while (downloaded < length) { 
        if (length < buffersize) { 
         read = is.read(imageData, downloaded, length); 
        } else if ((length - downloaded) <= buffersize) { 
         read = is.read(imageData, downloaded, length 
           - downloaded); 
        } else { 
         read = is.read(imageData, downloaded, buffersize); 
        } 
        downloaded += read; 
        publishProgress((downloaded * 100)/length); 
       } 
       Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, 
         length); 
       if (bitmap != null) { 
        Log.i(TAG, "Bitmap created"); 
       } else { 
        Log.i(TAG, "Bitmap not created"); 
       } 
       is.close(); 
       return bitmap; 
      } catch (MalformedURLException e) { 
       Log.e(TAG, "Malformed exception: " + e.toString()); 
      } catch (IOException e) { 
       Log.e(TAG, "IOException: " + e.toString()); 
      } catch (Exception e) { 
       Log.e(TAG, "Exception: " + e.toString()); 
      } 
      return null; 

     } 

     protected void onPostExecute(Bitmap result) { 
      String name = ImageLink.substring(ImageLink 
        .lastIndexOf("/") + 1); 
      if (result != null) { 
       hasExternalStoragePublicPicture(name); 
       saveToSDCard(result, name); 
       isImage = true; 

      } else { 
       isImage = false; 

      } 
     } 
    } 

    public void saveToSDCard(Bitmap bitmap, String name) { 
     boolean mExternalStorageAvailable = false; 
     boolean mExternalStorageWriteable = false; 
     String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      mExternalStorageAvailable = mExternalStorageWriteable = true; 
      Log.v(TAG, "SD Card is available for read and write " 
        + mExternalStorageAvailable + mExternalStorageWriteable); 
      saveFile(bitmap, name); 
     } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
      mExternalStorageAvailable = true; 
      mExternalStorageWriteable = false; 
      Log.v(TAG, "SD Card is available for read " 
        + mExternalStorageAvailable); 
     } else { 
      mExternalStorageAvailable = mExternalStorageWriteable = false; 
      Log.v(TAG, "Please insert a SD Card to save your image " 
        + mExternalStorageAvailable + mExternalStorageWriteable); 
     } 
    } 

    private void saveFile(Bitmap bitmap, String name) { 

     String filename = name; 
     ContentValues values = new ContentValues(); 
     File sdImageMainDirectory = new File(Environment 
       .getExternalStorageDirectory(), getResources().getString(
       R.string.directory)); 
     sdImageMainDirectory.mkdirs(); 
     File outputFile = new File(sdImageMainDirectory, filename); 
     values.put(MediaStore.MediaColumns.DATA, outputFile.toString()); 
     values.put(MediaStore.MediaColumns.TITLE, filename); 
     values.put(MediaStore.MediaColumns.DATE_ADDED, System 
       .currentTimeMillis()); 
     values.put(MediaStore.MediaColumns.MIME_TYPE, "image/png"); 
     Uri uri = this.getContentResolver().insert(
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 

       values); 
     try { 
      OutputStream outStream = this.getContentResolver() 
        .openOutputStream(uri); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 95, outStream); 

      outStream.flush(); 
      outStream.close(); 

     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private boolean hasExternalStoragePublicPicture(String name) { 
     File sdImageMainDirectory = new File(Environment 
       .getExternalStorageDirectory(), getResources().getString(
       R.string.directory)); 
     File file = new File(sdImageMainDirectory, name); 
     if (file != null) { 
      file.delete(); 
     } 

     return file.exists(); 
    } 

回答

0

我對你的情況做了測試。我的例子很簡單,我在舞臺上放了一個按鈕。當我點擊按鈕時,我會啓動兩個asyncTask來下載兩張圖片。我在我的SD卡中創建一個文件夾。經過測試,我可以在文件夾中找到兩張照片。

後,我檢查你的代碼,我想你有一個類變量 ImageLink的,這時候你叫getLocalLink兩次被分配兩次。所以圖像將存儲在第二個圖像名稱文件中。

你可以檢查我的例子,它符合你的要求。您可以創建多個asyncTask來下載多個圖像。請檢查AsyncTask部分。

http://jmsliu.com/1929/android-progress-dialog-example.html