2013-02-20 38 views
0

im从web加载10张图像到SD卡,我的代码创建了SD卡中的子文件夹并载入所有10张图像,但仅在第一次加载并存储任何图像之后,也logcat中没有错误。这里是我的代码:未显示SD卡中的下载图像

reviewImageLink = u_image; 
       URL reviewImageURL; 
       String name = reviewImageLink.substring(reviewImageLink.lastIndexOf("/") + 1); 
        try { 
         reviewImageURL = new URL(reviewImageLink); 
         if (!hasExternalStoragePublicPicture(name)) { 
          isImage = false; 
          new DownloadImageTask().execute(reviewImageURL); 
          Log.v("log_tag", "if"); 
          isImage = true; 
          File sdImageMainDirectory = new File(Environment.getExternalStorageDirectory(), getResources().getString(R.string.directory)); 
          sdImageMainDirectory.mkdirs(); 
          file = new File(sdImageMainDirectory, name); 
          Log.v("log_tag", "Directory created"); 
         } 

        } catch (MalformedURLException e) { 
         Log.v(TAG, e.toString()); 
        } 

DownloadImageTask:

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 = reviewImageLink.substring(reviewImageLink 
       .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 Video "+ 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, "output.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(); 
} 

这里是logcat的:

02-20 08:49:46.999: D/dalvikvm(346): GC_FOR_MALLOC freed 5254 objects/245320 bytes in 69ms 
02-20 08:50:00.138: I/Topten(346): Bitmap created 
02-20 08:50:00.148: V/Topten(346): SD Card is available for read and write truetrue 
02-20 08:50:03.628: D/dalvikvm(346): GC_EXTERNAL_ALLOC freed 4548 objects/238192 bytes in 68ms 
02-20 08:50:03.728: I/Topten(346): Bitmap created 
02-20 08:50:03.738: V/Topten(346): SD Card is available for read and write truetrue 
02-20 08:50:04.898: D/dalvikvm(346): GC_EXTERNAL_ALLOC freed 585 objects/85272 bytes in 107ms 
02-20 08:50:05.018: I/Topten(346): Bitmap created 
02-20 08:50:05.049: V/Topten(346): SD Card is available for read and write truetrue 
02-20 08:50:05.528: I/Topten(346): Bitmap created 
02-20 08:50:06.409: V/Topten(346): SD Card is available for read and write truetrue 
02-20 08:50:10.968: I/Topten(346): Bitmap created 
02-20 08:50:10.968: V/Topten(346): SD Card is available for read and write truetrue 
02-20 08:50:12.368: I/Topten(346): Bitmap created 
02-20 08:50:12.380: V/Topten(346): SD Card is available for read and write truetrue 
02-20 08:50:15.569: D/dalvikvm(346): GC_EXTERNAL_ALLOC freed 4584 objects/358728 bytes in 58ms 
02-20 08:50:15.619: I/Topten(346): Bitmap created 
02-20 08:50:15.629: V/Topten(346): SD Card is available for read and write truetrue 
02-20 08:50:22.179: I/Topten(346): Bitmap created 
02-20 08:50:22.189: V/Topten(346): SD Card is available for read and write truetrue 

回答

1

编辑: 您的代码似乎correct..I还没找到它有任何不妥之处。 我不能确定它是否是原因或没有,但.. 创建目录检查目录是否存在不

if(!sdImageMainDirectory.exists()){ 
sdImageMainDirectory.mkdirs(); 
} 

检查一次,getback我之前...进一步分析......我希望这会帮助你。


您还没有写入文件到您刚才创建的文件外部存储......尝试写文件到外部存储装置,并确保你已经设置的权限外部存储器写

+0

查看我更新的问题。 – 2013-02-21 06:06:27

+0

@BibiTahira它不会影响文件..而是它每次停止创建目录(即只有一个文件夹)。我也发现了一些错误String name = reviewImageLink.substring(reviewImageLink .lastIndexOf(“/”)+ 1);具有单个参数的子字符串还是复制粘贴问题...? – Pragnani 2013-02-21 07:30:09

+0

子串应该有两个参数...我怀疑你每次都得到相同的文件名,这就是为什么我已经看到了,应该是。 String name = reviewImageLink.substring(reviewImageLink .lastIndexOf(“/”)+ 1,reviewImageLink.length()); – Pragnani 2013-02-21 07:45:37

0

如果我没有错,你的变量reviewImageLink是一个类变量。然后,在您的DownloadImageTask中,您正在使用reviewImageLink生成文件名并将图像保存在此文件中。

问题是:如果你一个接一个地调用你的函数10次,你的类变量reviewImageLink将被最后一次调用覆盖。这可能会导致您的应用程序始终只保存一个图像。

我的建议是你可以在你的DownloadImageTask里面生成你的图片文件名。所以下载完成后,它会将图像文件保存在单独的文件中。

下面是我如何下载图像并保存在本地。我把下载和保存在AsyncTask类。我也决定AsyncTask内的文件名。所以其他下载过程没有冲突。请检查我的下载图片任务班。

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

相关问题