2012-04-15 61 views
5

不工作當我嘗試將位圖上我用這個小部件:setImageViewBitmap在Android小工具

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); 
+0

可能這與http://code.google.com/p/android/issues/detail?id=8489? – Heinrisch 2012-04-15 08:22:54

+0

是的,我之前看到過這個,但是由於質量和透明度,我需要ARGB_8888。 – AVEbrahimi 2012-04-15 08:35:27

+0

您可能需要發送更少的數據,這意味着更小或下采樣的圖像,或將URI傳遞給圖像。 – wsanville 2012-08-31 19:58:40

回答

6

首先,W ithout你的解決方法,請檢查您的logcat輸出:

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

你可能會碰到文件大小限制爲包含您的更改RemoteViews層次的IPC交易。

當複製與Bitmap.Config.ARGB_4444配置所述位圖,每個像素將用2個字節來表示,而Bitmap.Config.ARGB_8888(上2.3和至多默認的配置)的每個像素是4個字節[Source]

通過使用您的解決方法,您傳遞了一半的數據,因此,吱吱作響的大小限制。 This post建議大小限制爲1MB,但我不確定每個操作系統版本或製造商是否有所不同。

更新:傳遞圖像的另一種方法是不發送位圖本身,而是將URI傳遞到磁盤上的文件。然後,您需要確保其他進程對您的文件具有讀取權限(例如,啓動器將運行在不同的進程中)。如果要將文件寫入/data/data/my.package.name/目錄,則可以通過在Context.openFileOutput()上指定MODE_WORLD_READABLE來執行此操作。例如:

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

setUri就像一個魅力。 – Grimmace 2012-10-30 00:13:38

+0

setUri真的幫了我。偉大的建議......謝謝! – tronious 2015-03-05 20:04:13