如何从包含 Android 上自动下载图片的 url 中读取图片?

Posted

技术标签:

【中文标题】如何从包含 Android 上自动下载图片的 url 中读取图片?【英文标题】:How to read a picture from an url that contains an auto-download picture on Android? 【发布时间】:2018-09-06 17:05:21 【问题描述】:

尝试在 UI 上显示来自自动下载链接的图片时遇到问题。 Picasso 和 Glide 不知道如何打开它。他们正在寻找地址。

例如,我有这张图片https://graph.facebook.com/10155174010491889/picture?type=large。当您访问该链接时,您会自动获得下载的图片。毕加索不知道如何处理这个问题。

我研究了这个问题(https://github.com/square/picasso/issues/463),应用了 OkHttpClient 和下载器,但还是不行:

OkHttpClient client = new OkHttpClient.Builder().build();
Downloader downloader = new OkHttp3Downloader(client);

        new Picasso.Builder(context)
                .downloader(downloader)
                .listener((picasso, uri, exception) -> 
                    exception.printStackTrace();
                    Log.d(TAG, "loadImageWithPicasso: " + exception);
                )
                .build()
                .load(Uri.parse(path))
                .centerCrop()
                .fit()
                .into(imageView, new Callback() 
                    @Override
                    public void onSuccess() 
                        imageView.setImageDrawable(ImageUtils.roundedCornersImage(context, imageView));
                    

                    @Override
                    public void onError() 
                        imageView.setImageResource(resourceDrawable);
                    
                );

我什至单独尝试对该图像发出 OkHTTP 请求并得到奇怪的结果 - 位图为空(尝试下载为位图时),网络响应重定向 url 大小为 0 的图像 (https://m.facebook.com/platform/profilepic/?asid=10155174010491889&height=200&width=200)

getRequest("https://graph.facebook.com/10155174010491889/picture?type=large", new okhttp3.Callback() 
                @Override
                public void onResponse(Call call, Response response) throws IOException 
                    Log.d(TAG, "body = " + response.body());
                    Log.d(TAG, "network response = " + response.networkResponse().toString());
                    InputStream inputStream = response.body().byteStream();
                    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

                    Log.d(TAG, response.networkResponse().request().url() + " <<<<");

                

                @Override
                public void onFailure(Call call, IOException e) 

                

            );
        
    

    public static void getRequest(String url, okhttp3.Callback callback) 
        OkHttpClient client = new OkHttpClient.Builder().build();
        Request request = new Request.Builder()
                .url(url)
                .get()
                .build();
        client.newCall(request).enqueue(callback);
    

我看到 Postman 使用简单的 GET 打开图片,没有暗示任何问题。

对于这种情况,您有什么建议可以解决?

【问题讨论】:

我在我的一个项目中尝试了你的网址,Glide 加载它没有任何问题 @IonutJ.Bejan,你能分享一下小代码sn-p吗?我也尝试过使用 Glide,但没有成功。 【参考方案1】:

您的链接在 Glide 4.6.1

中完美运行
Glide.with(this)
     .load("https://graph.facebook.com/10155174010491889/picture?type=large")
     .into(imageview);

【讨论】:

@Nijunj,谢谢你的回答。正如我之前对 Ionut J. Bejan 所说,这是一种非常奇怪的行为。昨天我用 Picasso 和 Glide 测试了几个小时,我收到了这条消息“java.io.IOException:无法解码流”,现在一切正常,正如你所说。这肯定是脸书的问题。可能他们不时来。如果您觉得我的问题很有趣,可以点赞吗?【参考方案2】:

你去吧! Glide 版本 3.5.2

Glide.with(context)
.load("https://graph.facebook.com/10155174010491889/picture?type=large")
.centerCrop().listener(new RequestListener<String, GlideDrawable>() 
                    @Override
                    public boolean onException(Exception e, 
                    String model, 
                    Target<GlideDrawable> target, 
                    boolean isFirstResource) 
                        spinKitView.setVisibility(View.GONE);
                        return false;
                    

                    @Override
                    public boolean onResourceReady(GlideDrawable resource, 
                    String model, 
                    Target<GlideDrawable> target, 
                    boolean isFromMemoryCache, boolean isFirstResource) 
                        spinKitView.setVisibility(View.GONE);
                        return false;
                    
                ).into(profile_picture);

【讨论】:

这太奇怪了。昨天它在 Picasso 或 Glide 上工作了几个小时,今天突然在他们两个上都工作了,没有代码更改......可能是 facebook 问题...... 当时证明是facebook的临时问题。

以上是关于如何从包含 Android 上自动下载图片的 url 中读取图片?的主要内容,如果未能解决你的问题,请参考以下文章

如何把浏览的书籍自动抓图

如何使用 Python 从需要登录信息的网站下载文件?

android如何将图像从互联网下载到本地存储?

Android加载网络GIF完整解决方案

如何自动下载从画布元素中获取的图像?

如何在不先“下载”的情况下通过 Android 网络浏览器显示 PDF