2014-07-23 72 views
0

我將一個drawable傳遞給位圖,然後將其轉化爲一個bytearray並再次返回。但是,這會導致onReceive發生錯誤。我做錯了什麼,以及如何正確傳遞它而不會破壞接收器?從服務到意圖的位圖導致RuntimeException接收到廣播意圖

錯誤(這裏充分:http://pastebin.com/DtBWK8bc):

java.lang.RuntimeException: Error receiving broadcast Intent { 
act=com.mytest.accessibility.CATCH_NOTIFICATION flg=0x10 (has extras) } in 
nexter[email protected]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

請張貼整個堆棧跟蹤。 – CommonsWare

+0

@CommonsWare添加pastebin的問題。 – Carl

回答

0

我終於搞定了!大部分的功勞歸功於用戶@MartinPelant(ref: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);