android - 如何将图像复制到SD卡中的文件夹

时间:2011-09-09 10:16:23

标签: android

在我的应用程序中,我正在从网上下载图像,这些图像将存储在SD卡中。这里我使用url作为文件名。首先我要检查文件名是否在SD卡中退出。如果它存在,那么从SD卡获取图像。否则我从web获得。但我正在解决以下异常如何处理它。

异常

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

2 个答案:

答案 0 :(得分:0)

只需添加AndroidManifest.xml文件的权限并检查,它可能会有效。

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

答案 1 :(得分: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" />