如何将图像从 url 加载到小部件的 android 远程视图中

Posted

技术标签:

【中文标题】如何将图像从 url 加载到小部件的 android 远程视图中【英文标题】:How can I load an image from a url into an android remote view for a widget 【发布时间】:2014-01-16 01:33:39 【问题描述】:

我有一个图像 url,我解析表单 json,我想将其加载到主屏幕上的 android 小部件中。现在我正在尝试这样做,但它是错误的:

ImageDownloadTask imageD = new ImageDownloadTask(image);
            views.setImageViewBitmap(R.id.image, imageD.execute(image));

image 是一个字符串,其中包含需要下载的图像的 url,我正在尝试将其设置为 R.id.image

我发现了另一个堆栈问题并尝试了这个结果:

views.setBitmap(R.id.image, "setImageBitmap",BitmapFactory.decodeStream(new URL(image).openStream()));

当我使用该应用程序中的任何内容时,根本不会设置任何文本视图。

我的第三次尝试是这样的:

 //get beer data
            JSONObject o = new JSONObject(result);
            String name = getName(o);
            String image = getImage(o);
            String abv = getABV(o);
            String ibu = getIBU(o);
            String glass = getGlass(o);
            String beerBreweryName = getBreweryName(o);
            String beerBreweryStyle = getBreweryStyle(o);
            String beerDescription = getDescription(o);

            InputStream in = new java.net.URL(image).openStream();
            Bitmap bitmap = BitmapFactory.decodeStream(in);



            views.setTextViewText(R.id.beerTitle, name);
            views.setTextViewText(R.id.beerBreweryName, beerBreweryName);
            views.setTextViewText(R.id.beerStyleName, beerBreweryStyle);
            views.setImageViewBitmap(R.id.image, bitmap);

这给出了与上次尝试相同的结果,它甚至不会设置任何文本视图....

在下面发布的答案之一之后又尝试了另一次尝试:

RemoteViews views = new RemoteViews(c.getPackageName(), R.layout.widget_test);

            //get beer data
            JSONObject o = new JSONObject(result);
            String name = getName(o);
            String imageURL = getImage(o);
            String abv = getABV(o);
            String ibu = getIBU(o);
            String glass = getGlass(o);
            String beerBreweryName = getBreweryName(o);
            String beerBreweryStyle = getBreweryStyle(o);
            String beerDescription = getDescription(o);

            Log.d("widgetImage" , imageURL);
            views.setImageViewUri(R.id.image, Uri.parse(imageURL));

            views.setTextViewText(R.id.beerTitle, name);
            views.setTextViewText(R.id.beerBreweryName, beerBreweryName);
            views.setTextViewText(R.id.beerStyleName, beerBreweryStyle);




            mgr.updateAppWidget(appWidgetIds, views);

这个尝试让所有的文本视图加载,但没有图像出现。

【问题讨论】:

【参考方案1】:

可靠地做到这一点的方法是在远程ImageView 上使用setImageViewURI。诀窍是您给它的 URI 是一个 content:// URI,然后它指向您从应用程序导出的内容提供程序。在您的内容提供者中,您可以做任何您需要做的事情来提供图像字节。

例如,在您的清单中:

<provider android:name=".ImageContentProvider" android:authorities="com.example.test" android:exported="true" />

还有你的供应商:

public class ImageContentProvider extends ContentProvider 

    // (Removed overrides that do nothing) 

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException 
        List<String> segs = uri.getPathSegments();

        // Download the image content here, get the info you need from segs

        return ParcelFileDescriptor.open(new File(path), ParcelFileDescriptor.MODE_READ_ONLY);
    

然后你的 URL 是这样的:

content://com.example.test/something-you-can-define/here

这是必要的,因为您的远程图像视图未在您的进程中运行。您可以做的事情受到更多限制,因为所有内容都必须跨流程边界进行序列化。 URI 可以很好地序列化,但如果您尝试使用setImageViewBitmap 发送一兆字节的图像数据,它可能会失败(取决于可用的设备内存)。

【讨论】:

所以我只是尝试了这个:views.setImageViewUri(R.id.image, Uri.parse(imageURL));我所有的文本视图都已加载,但图像从未出现在小部件中。 如果你给它一个 http 的 imageURL,它不会工作 - Android 不会为你加载它。你必须给它一个指向你的内容提供者的内容 URL。 不是 100% 确定你的意思,会尝试看看我能在谷歌上找到什么。 我要放置的网址是:s3.amazonaws.com/brewerydbapi/beer/oBr6Tr/… 如果您找到另一种可靠的方法,我真的很想听听。或者,如果您最终使用这种方法,请随意标记为答案:D【参考方案2】:

这个问题从多个来源获得了很多帮助。对我来说,为什么我上面列出的一堆尝试似乎锁定了小部件应用程序而不加载任何东西对我来说最大的问题是因为我无法下载图像并将其设置在 UI 线程中。

为了实现这一点,我必须将所有内容移至异步任务的后台执行,而不是在 onPostExecute 中。

【讨论】:

以上是关于如何将图像从 url 加载到小部件的 android 远程视图中的主要内容,如果未能解决你的问题,请参考以下文章

毕加索:将图像加载到小部件列表视图

将数据从 Flutter Stream 传递到小部件

如何从Firebase将单个图像URL串入我的flutter应用程序?

如何从 URL 将图像加载到 imageView? [复制]

如何将图像从 url 沿侧输入类型文件加载到 html5 画布?

如何从从json获得的url加载图像到collectionview