从服务到intent的位图导致RuntimeException接收广播意图

时间:2014-07-23 17:48:33

标签: android android-intent bitmap bytearray

我将一个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);

1 个答案:

答案 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);