SD卡写入失败?

时间:2010-10-02 00:02:24

标签: java android inputstream sd-card

有人可以告诉我这段代码我哪里出错吗?基本上我希望该应用程序下载.png文件,将其显示给用户,并将其保存到SD卡以供将来参考。在while ((len = webstream.read(buffer)) > 0)部分之前似乎一切顺利;因为调试器没有到达我在这里放置的断点,并且我有一个空的.png文件目录。我在我的清单中声明了WRITE_EXTERNAL_STORAGE权限。

protected class DownloadTask extends AsyncTask<String, Integer, Bitmap> {

    @Override
    protected Bitmap doInBackground(String... string) {

        Bitmap d = null;

        try {

            DefaultHttpClient dhc = new DefaultHttpClient();
            HttpGet request = new HttpGet(HTTP_BASE + string[0] + ".png");
            HttpResponse response = dhc.execute(request);
            BufferedInputStream webstream = new BufferedInputStream(response.getEntity().getContent());
            d = BitmapFactory.decodeStream(webstream);
            writeToSd(string[0], webstream, d);

        }
        catch (Exception ex) { ex.printStackTrace(); }

        return d;

    }

    private void writeToSd(String string, BufferedInputStream webstream, Bitmap d) {

        try {

            webstream.mark(3);
            webstream.reset();
            File f = new File(Environment.getExternalStorageDirectory() + SD_DIR);
            f.mkdirs();
            File f2 = new File(f, string + ".png");
            f2.createNewFile();
            BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(f2));

            int len;
            byte[] buffer = new byte[1024];
            while ((len = webstream.read(buffer)) > 0) {

                fos.write(buffer, 0, len);

            }

            webstream.close();
            //fos.flush();
            fos.close();

        }
        catch (Exception ex) {

            ex.printStackTrace();

        }


    }

    protected void onPostExecute(Bitmap result) {

        if (result != null) {
            iv.setImageBitmap(result);
            vs.setDisplayedChild(1);
        }

    }

};

2 个答案:

答案 0 :(得分:1)

我不确定,但重新读取InputStream似乎有些问题,即使它是缓冲的。图像是存储在内存中的相当多的数据。而不是做

  

获取图像,显示图像,存储图像

你可以尝试

  

获取图像,存储图像,显示图像

通过这种方式,您可以将完整大小的映像写入磁盘(无需缓冲流并消耗大量内存)。然后,您只需以适用于您的应用程序的最低采样率从SD卡加载图像,从而节省内存中的全尺寸图像。此外,这样做可能会消除您使用bufferedInputStream可能会或可能没有的任何问题 - 我发现它们非常挑剔。

答案 1 :(得分:1)

除非您需要原始流字节,否则可以使用Bitmap.compress(format, quality, stream)将位图写入磁盘。

然而,从记忆保护的角度来看,哈米的答案可能是最好的。

相关问题