2012-04-15 23 views
5

Khi tôi cố gắng đặt một bitmap trên một widget Tôi sử dụng này:setImageViewBitmap không làm việc trong android tùng

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

này hoạt động trên điện thoại của tôi nhưng không phải trên máy tính bảng Galaxy của tôi hay Galaxy Note,

nếu tôi sao chép theBitmap vào một mới ARGB_4444 sau đó nó hoạt động trên tất cả các thiết bị:

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

Điều này có thể giống như: http://code.google.com/p/android/issues/detail?id=8489? – Heinrisch

+0

vâng, tôi đã thấy điều này trước đây, nhưng tôi cần ARGB_8888 vì chất lượng và tính minh bạch. – AVEbrahimi

+0

Bạn có thể cần phải gửi ít dữ liệu hơn, có nghĩa là hình ảnh nhỏ hơn hoặc được lấy mẫu xuống hoặc chuyển URI vào hình ảnh thay thế. – wsanville

Trả lời

6

Thứ nhất, w ithout workaround, hãy kiểm tra đầu ra logcat của bạn cho:

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

Bạn đang có lẽ đánh giới hạn kích thước tập tin cho giao dịch IPC chứa những thay đổi của mình vào hệ thống phân cấp RemoteViews.

Khi bạn sao chép bitmap với cấu hình Bitmap.Config.ARGB_4444, mỗi pixel sẽ được biểu thị bằng 2 byte, trong khi Bitmap.Config.ARGB_8888 (cấu hình mặc định trên 2,3 trở lên) mỗi pixel là 4 byte [Source].

Bằng cách sử dụng giải pháp thay thế của bạn, bạn đang chuyển một nửa số lượng dữ liệu và do đó, làm giảm giới hạn kích thước. This post cho biết giới hạn kích thước là 1MB, nhưng tôi không chắc liệu điều đó có thay đổi theo từng phiên bản hệ điều hành hay nhà sản xuất hay không.

Cập nhật: Một cách tiếp cận khác để truyền ảnh sẽ không gửi bản thân bitmap, mà là chuyển URI vào tệp trên đĩa. Sau đó, bạn cần phải đảm bảo rằng các quy trình khác sẽ có quyền truy cập đọc vào tệp của bạn (trình khởi chạy sẽ chạy trong một quy trình khác chẳng hạn). Nếu bạn đang viết các tệp vào thư mục /data/data/my.package.name/ của mình, bạn có thể thực hiện việc này bằng cách chỉ định MODE_WORLD_READABLE trên Context.openFileOutput(). Ví dụ:

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

Tập hợp đó hoạt động như một sự quyến rũ. – Grimmace

+0

setUri thực sự đã giúp tôi. Lời khuyên tuyệt vời ... cảm ơn bạn! – tronious

Các vấn đề liên quan