我将一个drawable传递给位图,然后将其转换为bytearray并再次返回。但是这会导致onReceive出错。我做错了什么,如何在不破坏接收器的情况下正确传递?
错误(在此处完整:http://pastebin.com/DtBWK8bc):
java.lang.RuntimeException: Error receiving broadcast Intent {
act=com.mytest.accessibility.CATCH_NOTIFICATION flg=0x10 (has extras) } in
nexter.lpvlock.material.com.accessb.ToastOrNotificationTestActivity$1@b10a35a8
服务:
drawable = remotePackageContext.getResources().getDrawable(notification.icon);
Bitmap mIcon = convertToBitmap(drawable, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
mIcon.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
Intent mIntent = new Intent(Constants.ACTION_CATCH_NOTIFICATION);
mIntent.putExtra("text", notification.tickerText.toString());
mIntent.putExtra("icon", b);
MyAccessibilityService.this.getApplicationContext().sendBroadcast(mIntent);
活动(错误指向BitmapFactory行成为罪魁祸首):
byte[] b = getIntent().getByteArrayExtra("icon");
Bitmap bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
iView.setImageBitmap(bmp);
答案 0 :(得分:0)
我终于开始工作了!大部分功劳归功于用户@MartinPelant(参考:https://stackoverflow.com/a/16258120/2423004)。
我不知道为什么弹出错误,但我假设位图或bytearray存在问题。我将假设位图不包含正确的位图/可绘制。但在我的使用中,我一直在寻找使用AccessibilityService的传入通知的通知图标。如果你来这里寻找相同的答案,那么这里。可以通过在通知中查找第一个ImageView来(正确)检索它:
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
Log.i("onAccessibilityEvent", "");
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
if (event.getParcelableData() instanceof Notification) {
Notification notification = (Notification) event.getParcelableData();
try {
extractImage(notification.tickerView);
} catch (Exception e) {
e.printStackTrace();
extractImage(notification.contentView);
}
}
}
可以在所引用的链接处找到用于提取通知的方法。
我将此作为答案发布,因为除了AccessibilityService中的文本或包名称之外,几乎没有任何正当的解释。如果没有这个,最远的就是通过意图传递一个drawable / bitmap,这最终会导致上述问题的错误。
编辑并且更加清晰,在extractImage方法中将其传递给您的活动:
Bitmap mIcon = convertToBitmap(drawable, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
mIcon.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
Intent mIntent = new Intent(Constants.ACTION_CATCH_NOTIFICATION);
mIntent.putExtra("icon", b);
MyAccessibilityService.this.getApplicationContext().sendBroadcast(mIntent);