2011-09-09 8 views
0

私のアプリケーションでは、Webから画像をダウンロードしています。これらの画像はsdcardに保存されます。ここで私はファイル名としてURLを使用しています。この最初の私は、ファイル名をチェックしていますsdcardで終了します。存在する場合は、sdcardからイメージを取得します。それ以外の場合、私はweb.Butから私はそれを処理する次の例外を取得して取得しています。android - sdcardのフォルダに画像をコピーする方法

例外

09-09 15:24:58.873: WARN/System.err(1117): java.io.IOException: Parent directory of file is not writable: /sdcard/http+++ecx.images-amazon.com+images+I+41KdssHpg1L._SL160_.jpg  
09-09 15:24:58.904: WARN/System.err(1117):  at java.io.File.createNewFile(File.java:1263) 
09-09 15:24:58.924: WARN/System.err(1117):  at com.ibkr.elgifto.GiftCategories$itemlistadapter$4$1.run(GiftCategories.java:947) 

コード

private Drawable getDrawableFromUrl(String imageUrl) { 
    String filename = imageUrl; 
    filename = filename.replace("/", "+"); 
    filename = filename.replace(":", "+"); 
    filename = filename.replace("~", "s"); 
    final File file = new File(Environment.getExternalStorageDirectory() + File.separator + filename); 
    boolean exists = file.exists(); 
    if (!exists) { 
     try { 
      URL myFileUrl = new URL(imageUrl); 
      HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); 
      conn.setDoInput(true); 
      conn.connect(); 
      InputStream is = conn.getInputStream(); 
      final Bitmap result = BitmapFactory.decodeStream(is); 
      is.close(); 
      new Thread() { 
       public void run() { 
        ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
        if (result != null) { 
         result.compress(Bitmap.CompressFormat.JPEG, 40, bytes); 
        } 
        try { 
         if (file.createNewFile()) { 
          // 
         } else { 

          // 
         } 

         FileOutputStream fo; 
         fo = new FileOutputStream(file); 
         fo.write(bytes.toByteArray()); 

         fo.flush(); 
         fo.close(); 
         // result.recycle(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      }.start(); 
      BitmapDrawable returnResult = new BitmapDrawable(result); 
      return returnResult; 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } else { 
     return new BitmapDrawable(BitmapFactory.decodeFile(file.toString())); 
    } 
} 

答えて

0

だけのAndroidManifest.xmlファイルにパーミッションを追加し、確認し、それが動作する可能性があります。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
0

アクセスする前に必ずSDストレージが利用可能かどうかを確認する必要があります。そうでない場合は、アプリケーションのクラッシュではなく、障害についてユーザーに通知できます。ここで私が使用している機能です:

public static boolean storageAvailable() 
{ 
    String state = Environment.getExternalStorageState(); 
    if (!Environment.MEDIA_MOUNTED.equals(state)) return false; 
    return true; 
} 

はあなたのAndroidManifest.xmlに必要な権限を追加するのを忘れ可能性もあります:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />