繁体   English   中英

如何将图片从网址加载到小部件的android远程视图中

[英]How can I load an image from a url into an android remote view for a widget

我有一个图片网址,我要解析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);

这种尝试可以加载所有文本视图,但从未显示图像。

可靠地执行此操作的方法是在远程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发送兆字节的图像数据,则可能会失败(取决于可用的设备内存)。

从多个来源获得了很多有关此问题的帮助。 对我来说,最大的问题是为什么我上面列出的许多尝试似乎都锁定了窗口小部件应用程序且未加载任何内容,是因为我无法下载图像并将其设置在UI线程中。

为此,我必须在异步任务的后台而不是在onPostExecute中将所有操作移到do上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM