gpt4 book ai didi

java.lang.NullPointerException : Attempt to invoke virtual method 'android. content.pm.PackageManager

转载 作者:行者123 更新时间:2023-12-03 02:48:04 29 4
gpt4 key购买 nike

简介
我正在运行 flutter v1.17.5 DeviceApps v1.0.10 和 SystemAlertWindow v0.2.2+3(本质上不是最新版本)。而且我想从在前台运行的系统警报窗口打开我的应用程序,即使应用程序已关闭。
我正在使用 SystemOverlayWindow 插件和插件是一个 Activity SystemAlertWindowPlugin.java
在我的申请.kt 我注册插件并通过注册表

public class Application: FlutterApplication(), PluginRegistrantCallback {

override fun onCreate() {
super.onCreate();
FlutterFirebaseMessagingService.setPluginRegistrant(this);
SystemAlertWindowPlugin.setPluginRegistrant(this);
createNotificationChannels();
FlutterMain.startInitialization(this);
}

override fun registerWith(registry: PluginRegistry?) {
if (!registry!!.hasPlugin("io.flutter.plugins.firebasemessaging")) {
FirebaseMessagingPlugin.registerWith(registry!!.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
}
if (!registry!!.hasPlugin("in.jvapps.system_alert_window")) {
SystemAlertWindowPlugin.registerWith(registry!!.registrarFor("in.jvapps.system_alert_window"));
}
if (!registry!!.hasPlugin("fr.g123k.deviceapps")) {
DeviceAppsPlugin.registerWith(registry!!.registrarFor("fr.g123k.deviceapps"));
}
}
我还注册了另一个名为 的插件。设备应用 .这是 DeviceAppsPlugin DeviceAppsPlugin.java
问题
总之
所以系统覆盖(在前台运行)调用 > dart 回调 > 调用 DeviceApps 插件的方法 > 错误发生
加长版
我有一个已注册的静态回调 here当我与系统警报窗口进行点击交互时,它会被调用。但是现在我不想从那个静态回调中调用我的 Dart 代码中的 DeviceApps 插件
所以方法 channel 会调用 this这将运行 dart 中定义的静态回调。
这是使用后台 channel 注册和调用的静态 dart 回调
  static Future<void> systemOverlayOnClickListner(String tag) async {
switch (tag) {
case 'button_app_to_foreground':
DeviceApps.openApp('com.companyname.appname'); // this is where I try to run the plugin
await SystemAlertWindow.closeSystemWindow();
break;
}
回调将调用 DeviceApps 插件的方法。这会导致问题,因为 this方法将尝试从其构造函数中传递的 Activity 中获取包管理器。但根据这个错误, Activity 为空。
E/MethodChannel#g123k/device_apps(24210): Failed to handle method call
E/MethodChannel#g123k/device_apps(24210): java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.app.Activity.getPackageManager()' on a null object reference
E/MethodChannel#g123k/device_apps(24210): at fr.g123k.deviceapps.DeviceAppsPlugin.openApp(DeviceAppsPlugin.java:141)
所以它会在一个空对象上调用 getPackageManager()。
仅当从后台 channel 调用的此静态回调调用该 Activity 时,该 Activity 才为空。但不是当我通常从应用程序范围调用它时。为什么会这样?
结论
所以总而言之,当我从我的应用程序范围调用插件时,调用插件工作正常。但是一旦通过后台 channel 的方式调用回调, Activity 就会突然为空。
我不能只是在我的应用程序中启动一个隔离,然后从我的回调中向它发送一条消息,就像它是如何完成的 here .因为当应用程序关闭时我需要此代码才能工作,并且应用程序范围的隔离不在后台运行。
那么如何从回调中打开我的应用程序?
这是完整的堆栈跟踪
E/flutter (26735): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: PlatformException(error, Attempt to invoke virtual method 'android.content.pm.PackageManager android.app.Activity.getPackageManager()' on a null object reference, null)
E/flutter (26735): #0 StandardMethodCodec.decodeEnvelope
package:flutter/…/services/message_codecs.dart:569
E/flutter (26735): #1 MethodChannel._invokeMethod
package:flutter/…/services/platform_channel.dart:156
E/flutter (26735): <asynchronous suspension>
E/flutter (26735): #2 MethodChannel.invokeMethod
package:flutter/…/services/platform_channel.dart:329
E/flutter (26735): #3 DeviceApps.openApp
package:device_apps/device_apps.dart:81
E/flutter (26735): #4 SystemOverlayController.systemOverlayOnClickListner
package:appname/…/singletons/system_overlay_controller.dart:51
E/flutter (26735): #5 callbackDispatcher.<anonymous closure>
package:system_alert_window/system_alert_window.dart:136
E/flutter (26735): #6 MethodChannel._handleAsMethodCall
package:flutter/…/services/platform_channel.dart:409
E/flutter (26735): #7 MethodChannel.setMethodCallHandler.<anonymous closure>
package:flutter/…/services/platform_channel.dart:377
E/flutter (26735): #8 _DefaultBinaryMessenger.handlePlatformMessage
package:flutter/…/services/binding.dart:199
E/flutter (26735): #9 _invoke3.<anonymous closure> (dart:ui/hooks.dart:290:15)
E/flutter (26735): #10 _rootRun (dart:async/zone.dart:1184:13)
E/flutter (26735): #11 _CustomZone.run (dart:async/zone.dart:1077:19)
E/flutter (26735): #12 _CustomZone.runGuarded (dart:async/zone.dart:979:7)
E/flutter (26735): #13 _invoke3 (dart:ui/hooks.dart:289:10)
E/flutter (26735): #14 _dispatchPlatformMessage (dart:ui/hooks.dart:164:5
示例 repo
我什至尝试将 open app 方法直接添加到 forked系统警报窗口的版本。并将其实现到您可以在此处找到的示例存储库中,使用名为 my-branch 的分支。
https://github.com/michael-ottink/system_overlay_callback_null_activity
但它会引发完全相同的错误。即使我使用完全相同的 Activity 。所以我认为这与背景 channel 有关。
运行应用程序,然后单击按钮以获取叠加层。将应用程序置于后台,然后在叠加层中单击打开。发生错误。
额外信息
我认为 this只是在这里他们选择不注册插件是一个类似的问题,因为它只是前台。在我的情况下,我想 fork 这些插件中的任何一个并修改它们,以便它也可以在后台运行。我怎么做?

最佳答案

我在 https://github.com/fmatosqg/system_alert_window/tree/hack_fix 获得了修复崩溃症状的 hack。
简而言之,插件在不再可用时访问 Activity 。我的快速修复存储了 activity.applicationContext (保证在应用程序处于 Activity 状态时存在 - 即使它只是一个覆盖)并将其存储在一个静态变量中,该变量可能比类 SystemAlertWindowPlugin 中的对象生命周期更长.

. . .
private static Context staticContext;

. . .
private boolean openApp(String packageName) {
Intent launchIntent = staticContext.getPackageManager().getLaunchIntentForPackage(packageName);

if (launchIntent != null) {
// null pointer check in case package name was not found
staticContext.startActivity(launchIntent);

return true;
}
return false;
}
我想解释一下为什么这不是一个正确的解决方法,但我现在时间不多,稍后会尝试解释原因。但我不是 flutter 插件方面的专家,如果不花更多时间了解插件本身,我将无法确定正确的代码如何,而我可能无法做到这一点。
我做了一个非常相似的修复,在另一个插件上发生了非常相似的崩溃,我希望它可以帮助指导您或插件作者: https://github.com/hnvn/flutter_image_cropper/pull/167
最后,一点建议。 Android 从版本到版本变化很大,我敦促您在运行 android 10 和 11 的模拟器上尝试此修复和其他修复,因为它们对启动 Activity 的限制越来越多。我知道背景的变化,但我不是最新的所有细节,或者如果从叠加层启动构成 ANDROID 目的的前景或背景。尝尝: https://www.reddit.com/r/androiddev/comments/dcleem/android_10_restricts_how_to_start_activity_from/

关于java.lang.NullPointerException : Attempt to invoke virtual method 'android. content.pm.PackageManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62840471/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com