从Parcel解析位图

时间:2017-01-24 16:10:50

标签: android bitmap

我正在尝试解析谷歌地图通知。我设法解析了所有的行。 我需要解析谷歌地图图像的问题通过它定义下一个机动的方向。我使用下面的代码来解释“java.lang.RuntimeException:无法取消包含Bitmap”。

   if (sbn.getPackageName().equals("com.google.android.apps.maps")){
         Notification not = sbn.getNotification();
         RemoteViews views = (RemoteViews) not.bigContentView;
         List<String> text = new ArrayList<String>();
            try
               {
                Field field = views.getClass().getDeclaredField("mActions");
                 field.setAccessible(true);

                @SuppressWarnings("unchecked")
                 ArrayList<Parcelable> actions = (ArrayList<Parcelable>) field.get(views);

                 // Find the setText() and setTime() reflection actions
                   for (Parcelable p : actions)
                       {
                       Parcel parcel = Parcel.obtain();
                       p.writeToParcel(parcel, 0);
                       parcel.setDataPosition(0);

                // The tag tells which type of action it is (2 is ReflectionAction, from the source)
                 int tag = parcel.readInt();
                  if ( ( tag != 2 ) && ( tag != 12 )) {
                         continue;
                      }

                   // View ID
                   parcel.readInt();
                    String methodName = parcel.readString();
                    if (methodName == null){
                          continue;
                        }else if (methodName.equals("setImageBitmap")){
                        parcel.setDataPosition(0);
                        Bitmap bm = Bitmap.CREATOR.createFromParcel(parcel);
                              sendBroadcast(i2);
                       }
                       // Save strings
              else if (methodName.equals("setText"))
              {
                 // Parameter type (10 = Character Sequence)
                   parcel.readInt();

                   // Store the actual string
                String t = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel).toString().trim();
               text.add(t);
                }
        // Save times. Comment this section out if the notification time isn't important
          else if (methodName.equals("setTime"))
               {
                   // Parameter type (5 = Long)
                   parcel.readInt();

                  String t = new SimpleDateFormat("h:mm a").format(new Date(parcel.readLong()));
                   text.add(t);
               }
                  parcel.recycle();

            }
      }

  // It's not usually good style to do this, but then again, neither is the use of reflection...
  catch (Exception e)
   {
     Log.e("NotificationClassifier", e.toString());
   }
 }

编辑:我现在不关心内存加上我正在阅读谷歌地图图片,而不是将图片从活动发送到另一个活动。

3 个答案:

答案 0 :(得分:1)

所以,正如我所说,你不应该Bitmap进入ParcelBundle,这会导致你的应用程序显着减慢和可能的内存问题。

你应该怎么做

如果你真的需要将图像从一个地方传递到另一个地方 - 保存它。只需创建临时文件并将路径传递到此临时文件的任何位置。

如何从通知中获取位图?

你能吗?

经过一番思考,我打赌你不能这样做。但是,你可以做什么 - 它是屏幕截图。尝试找到放置ImageView的位置并捕获屏幕部分。然后做你想做的事。

答案 1 :(得分:0)

我认为你做的和我做同样的事情。无论如何,我也在同样的任务中挣扎。如果你不反对使用库,这对我来说非常有用。我在普通的ContentView上运行它虽然它也可以在BigContentView上运行。

如果需要,只需稍微修改一下即可。

RemoteViews remoteViews = sbn.getNotification().contentView;
RemoteViewsInfo info = RemoteViewsReader.read(this, sbn.getNotification().contentView);
RemoteViewsInfo info = RemoteViewsReader.read(this, remoteViews);
for (RemoteViewsAction action : info.getActions()) {
  if (!(action instanceof BitmapReflectionAction))
    continue;
  BitmapReflectionAction concrete = (BitmapReflectionAction)action;
  Bitmap bmp = concrete.getBitmap();
}

https://github.com/KeithYokoma/RemoteViewsReader

希望这有帮助

答案 2 :(得分:-1)

尝试将Byte []从drawable传递到parcel

<强> BUT:

  • @vamp你看,在Bundle或Parcel中传递大量字节并不是真的值得推荐的。这不仅会降低您的应用程序速度,还会导致内存问题。*