毕加索没有从文件加载图像

时间:2016-09-06 03:55:52

标签: java android picasso

我真的不知道自己做错了什么。

onPostExecute,我用我刚从位图创建的文件加载了ImageView:

public class ComicFragment extends Fragment
{
    private final static String URL1 = "http://192.168.1.143/jerson/sample_comic.jpg";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.fragment_comic, parent, false);
        ImageView imageView = (ImageView) view.findViewById(R.id.imageview_comic);

        Point point = getScreenSize();
        new DownloadImageTask(getActivity(), imageView, point.x, point.y).execute(URL1);

        //Uri uri = Uri.parse("http://192.168.1.143/jerson/sample_comic.jpg");
        //simpleDraweeView.setImageURI(uri);

        return view;
    }

    private Point getScreenSize()
    {
        Point point = new Point();
        WindowManager manager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        Display display = manager.getDefaultDisplay();
        display.getSize(point);

        return point;
    }

    private byte [] getBitmapByteArray(Bitmap bitmap)
    {
        int bytes = bitmap.getByteCount();
        ByteBuffer buffer = ByteBuffer.allocate(bytes);
        bitmap.copyPixelsToBuffer(buffer);

        return buffer.array();
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);
    }

    private int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight)
    {
        // From https://developer.android.com/training/displaying-bitmaps/load-bitmap.html#read-bitmap

        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth)
        {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth)
            {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }

    private class DownloadImageTask extends AsyncTask<String, Void, Bitmap>
    {
        private Context context;
        private int viewWidth;
        private int viewHeight;
        private ImageView canvas;

        public DownloadImageTask(Context context, ImageView view, int viewWidth, int viewHeight)
        {
            this.context = context;
            this.viewWidth = viewWidth;
            this.viewHeight = viewHeight;
            canvas = view;
        }

        @Override
        protected Bitmap doInBackground(String ... urls)
        {
            String url = urls[0];
            Bitmap comicBitmap = null;

            FileOutputStream out = null;

            File root = Environment.getExternalStorageDirectory();
            File directory = new File(root.getAbsolutePath() + "/DCIM/tmpimg/cached/");

            directory.mkdirs();
            File file = new File(directory, "tmp.png");

            try
            {
                InputStream forGettingSizeOnly = new BufferedInputStream(new URL(url).openStream());

                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;

                BitmapFactory.decodeStream(forGettingSizeOnly, null, options);
                int outWidth  = options.outWidth;
                int outHeight = options.outHeight;
                options.inSampleSize = calculateInSampleSize(options, viewWidth, viewHeight);
                options.inJustDecodeBounds = false;

                // Make this not load another image from network the second time...
                InputStream actualImage = new BufferedInputStream(new URL(url).openStream());
                Bitmap decodedImage = BitmapFactory.decodeStream(actualImage);

                out = new FileOutputStream(file);
                comicBitmap = Bitmap.createBitmap(decodedImage, 0, 0, outWidth, 400);
                comicBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                out.close();

                Log.i(ComicApplication.TAG, "****File saved at : " + file.getAbsolutePath() + "WxH" + outWidth + " x " + comicBitmap.getHeight());
            }
            catch(Exception e)
            {
                e.printStackTrace();
                Log.i(ComicApplication.TAG, "ERROR : " + e.getMessage());
            }

            return comicBitmap;
        }

        @Override
        protected void onPostExecute(Bitmap result)
        {
            File root = Environment.getExternalStorageDirectory();
            File file = new File(root.getAbsolutePath() + "/DCIM/tmpimg/cached/tmp/tmp.png");
            Picasso.with(context).load(file).into(canvas);
            Log.i(ComicApplication.TAG, "FILE LOADED FROM : " + file.getAbsolutePath());
        }
    }
}

我可以通过手机的图片浏览器查看tmp.png。我没有收到任何来自毕加索结束的例外,错误吗?

有人可以帮我解决为什么毕加索没有从文件中加载我的图片吗?

1 个答案:

答案 0 :(得分:2)

首先,确保您提供Picasso正确的文件路径, 那么你必须在app Manifest.xml中添加READ_EXTERNAL_STORAGE的权限:

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

将此行置于清单级别