setImageViewBitmap在android小部件中不起作用

时间:2012-04-15 08:13:17

标签: android bitmap widget rgb

当我尝试在小部件上放置位图时,我使用了这个:

theBitmap = Bitmap.createBitmap(WW, HH,
            Bitmap.Config.ARGB_8888);
.
.
// draw something using a canvas
.
.
rviews.setImageViewBitmap(R.id.time,theBitmap);

这适用于我的手机但不适用于我的Galaxy平板电脑或Galaxy Note,

如果我将 theBitmap 复制到新的 ARGB_4444 ,那么它适用于所有设备:

Bitmap clone= theBitmap.copy(Bitmap.Config.ARGB_4444, false); // workaround
rviews.setImageViewBitmap(R.id.time, clone);

1 个答案:

答案 0 :(得分:6)

首先,如果没有您的解决方法,请检查您的logcat输出:

ERROR/JavaBinder(20204): !!! FAILED BINDER TRANSACTION !!!

您可能正在达到保存对RemoteViews层次结构所做更改的IPC事务的文件大小限制。

使用Bitmap.Config.ARGB_4444配置复制位图时,每个像素将用2个字节表示,而Bitmap.Config.ARGB_8888(2.3及以上的默认配置)每个像素为4个字节{{3} }。

通过使用您的解决方法,您传递了一半的数据,因此,按大小限制发出吱吱声。 [Source]表示大小限制为1MB,但我不确定每个操作系统版本或制造商是否会有所不同。

更新:传递图像的另一种方法是不发送位图本身,而是将URI传递给磁盘上的文件。然后,您需要确保其他进程对您的文件具有读取权限(例如,启动程序将在不同的进程中运行)。如果您要将文件写入/data/data/my.package.name/目录,则可以通过在This post上指定MODE_WORLD_READABLE来执行此操作。例如:

remoteViews.setUri(R.id.time, "setImageURI", Uri.fromFile(file));