我正在尝试解析谷歌地图通知。我设法解析了所有的行。 我需要解析谷歌地图图像的问题通过它定义下一个机动的方向。我使用下面的代码来解释“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());
}
}
编辑:我现在不关心内存加上我正在阅读谷歌地图图片,而不是将图片从活动发送到另一个活动。
答案 0 :(得分:1)
所以,正如我所说,你不应该Bitmap
进入Parcel
或Bundle
,这会导致你的应用程序显着减慢和可能的内存问题。
如果你真的需要将图像从一个地方传递到另一个地方 - 保存它。只需创建临时文件并将路径传递到此临时文件的任何位置。
你能吗?
经过一番思考,我打赌你不能这样做。但是,你可以做什么 - 它是屏幕截图。尝试找到放置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:强>