【问题标题】:SD card writing fails?SD卡写入失败?
【发布时间】:2011-04-20 02:47:25
【问题描述】:

谁能告诉我这段代码哪里出了问题?基本上我希望应用程序下载一个 .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);
        }

    }

};

【问题讨论】:

    标签: java android inputstream sd-card


    【解决方案1】:

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

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

    你可以试试

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

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

    【讨论】:

      【解决方案2】:

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

      但是,从内存保护的角度来看,Hamy 的答案可能是最好的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多