6

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

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);
4

1 回答 1

8

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

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

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

当您使用Bitmap.Config.ARGB_4444配置复制位图时,每个像素将用 2 个字节表示,而Bitmap.Config.ARGB_8888(2.3 及更高版本的默认配置)每个像素是 4 个字节[Source]

通过使用您的解决方法,您传递了一半的数据,因此受到大小限制的影响。这篇文章建议大小限制为 1MB,但我不确定这是否因操作系统版本或制造商而异。

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

remoteViews.setUri(R.id.time, "setImageURI", Uri.fromFile(file));
于 2012-08-31T18:59:16.083 回答