openvpn_flutter icon indicating copy to clipboard operation
openvpn_flutter copied to clipboard

How To Initiate Connection From Outside The Main Thread (Needing only Application Context instead of Activity Context)

Open dVoidMan opened this issue 3 months ago • 2 comments

So far, the VPN connection works from the main thread (UI)

But I have been asked to add a functionality.

The app should actively listen for the connectivity status of the device.

It should then automatically trigger the VPN when it detects a wifi connection, even when the app is closed or swipped off.

I have been able to listen to these connections using a background plugin that runs on a separate thread.

But when I try to ininitaize the VPN, I get errors relating to activity context:

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): Failed to handle method call

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.app.Activity.getCacheDir()' on a null object reference

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at de.blinkt.openvpn.VPNHelper.<init>(VPNHelper.java:45)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin.lambda$onAttachedToEngine$0$id-laskarmedia-openvpn_flutter-OpenVPNFlutterPlugin(OpenVPNFlutterPlugin.java:81)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin$$ExternalSyntheticLambda0.onMethodCall(D8$$SyntheticClass:0)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.os.Handler.handleCallback(Handler.java:995)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.os.Handler.dispatchMessage(Handler.java:103)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.os.Looper.loopOnce(Looper.java:248)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.os.Looper.loop(Looper.java:338)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.app.ActivityThread.main(ActivityThread.java:9067)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at java.lang.reflect.Method.invoke(Native Method)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)

E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932)

E/flutter ( 5748): [ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: PlatformException(error, Attempt to invoke virtual method 'java.io.File android.app.Activity.getCacheDir()' on a null object reference, null, java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.app.Activity.getCacheDir()' on a null object reference

E/flutter ( 5748): at de.blinkt.openvpn.VPNHelper.<init>(VPNHelper.java:45)

E/flutter ( 5748): at id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin.lambda$onAttachedToEngine$0$id-laskarmedia-openvpn_flutter-OpenVPNFlutterPlugin(OpenVPNFlutterPlugin.java:81)

E/flutter ( 5748): at id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin$$ExternalSyntheticLambda0.onMethodCall(D8$$SyntheticClass:0)

E/flutter ( 5748): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267)

E/flutter ( 5748): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)

E/flutter ( 5748): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)

E/flutter ( 5748): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)

E/flutter ( 5748): at android.os.Handler.handleCallback(Handler.java:995)

E/flutter ( 5748): at android.os.Handler.dispatchMessage(Handler.java:103)

E/flutter ( 5748): at android.os.Looper.loopOnce(Looper.java:248)

E/flutter ( 5748): at android.os.Looper.loop(Looper.java:338)

E/flutter ( 5748): at android.app.ActivityThread.main(ActivityThread.java:9067)

E/flutter ( 5748): at java.lang.reflect.Method.invoke(Native Method)

E/flutter ( 5748): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)

E/flutter ( 5748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932)

E/flutter ( 5748): )

E/flutter ( 5748): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:653:7)

E/flutter ( 5748): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:367:18)

E/flutter ( 5748): <asynchronous suspension>

E/flutter ( 5748): #2 OpenVPN.initialize.<anonymous closure> (package:openvpn_flutter/src/vpn_engine.dart:108:13)

E/flutter ( 5748): <asynchronous suspension>

How can I go about this?

I would sincerly appreciate anyone's response.

dVoidMan avatar Oct 10 '25 13:10 dVoidMan

Anyone? 😢

@0ttik @codingbeast @nizwar

dVoidMan avatar Oct 11 '25 11:10 dVoidMan

Would really appreciate your response @nizwar

dVoidMan avatar Oct 13 '25 07:10 dVoidMan