从Android代码启动Intent后Flutter进程被杀死

问题描述

我正在开发Flutter插件,该插件可让我通过称为直接认证https://docs.tor.us/direct-auth/what-is-directauth的过程登录基于以太坊的钱包Torus。

这是插件文件

/** TorusDirect */
public class TorusDirectPlugin  implements FlutterPlugin,MethodCallHandler,ActivityAware  {
  /// The MethodChannel that will the communication between Flutter and native Android
  ///
  /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  /// when the Flutter Engine is detached from the Activity
  private Context context;
  private Activity activity;
  private MethodChannel channel;
  private TorusDirectSdk torusDirectSDK;
  private SubVerifierDetails subVerifierDetails;


  public void  onDetachedFromActivity() {
    System.out.println("onDetachedFromActivity called");

  }

  public void  onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {
    System.out.println("onReattachedToActivityForConfigChanges called");
  }

  public void onAttachedToActivity(ActivityPluginBinding binding) {
    activity = binding.getActivity();
  }

  public void onDetachedFromActivityForConfigChanges() {
    System.out.println("onDetachedFromActivityForConfigChanges called");
  }


  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding FlutterPluginBinding) {
    System.out.println("onAttachedToEngine called");
    channel = new MethodChannel(FlutterPluginBinding.getFlutterEngine().getDartExecutor(),"torus.Flutter.dev/torus-direct");
    channel.setMethodCallHandler(this);
    this.context = FlutterPluginBinding.getApplicationContext();
  }


  // This static function is optional and equivalent to onAttachedToEngine. It supports the old
  // pre-Flutter-1.12 Android projects. You are encouraged to continue supporting
  // plugin registration via this function while apps migrate to use the new Android APIs
  // post-Flutter-1.12 via https://Flutter.dev/go/android-project-migration.
  //
  // It is encouraged to share logic between onAttachedToEngine and registerWith to keep
  // them functionally equivalent. Only one of onAttachedToEngine or registerWith will be called
  // depending on the user's project. onAttachedToEngine or registerWith must both be defined
  // in the same class.
  public static void registerWith(Registrar registrar) {
    System.out.println("registerWith called");
    final MethodChannel channel = new MethodChannel(registrar.messenger(),"torus.Flutter.dev/torus-direct");
    channel.setMethodCallHandler(new TorusDirectPlugin());
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call,@NonNull Result result) {
    switch (call.method) {
      case "setVerifierDetails": 
          System.out.println(call.arguments);
        HashMap<String,String> args = (HashMap<String,String> ) call.arguments;
          String verifierTypestring  =  args.get("verifierType");
          String loginProviderString =  args.get("loginProvider");
          String clientId   =  args.get("clientId");
          String verifierName   = args.get("verifierName");
          String redirectURL  =  args.get("redirectURL");

        Log.d(TorusDirectPlugin.class.getSimpleName(),"Verifier Type: " + verifierTypestring);


          this.subVerifierDetails = new SubVerifierDetails(
                  LoginType.valueOf(loginProviderString.toupperCase()),clientId,verifierName,new Auth0ClientOptions.Auth0ClientOptionsBuilder("").build());

        DirectSdkArgs directSdkArgs = new DirectSdkArgs("torusapp://io.Flutter.app.FlutterApplication/redirect",TorusNetwork.TESTNET,"");
          this.torusDirectSDK  = new TorusDirectSdk(directSdkArgs,this.context);
        result.success(true);

      case "triggerLogin":
        Executors.newFixedThreadPool(10).submit(() -> {
          try {
            CompletableFuture<TorusLoginResponse> torusLoginResponseCompletableFuture = this.torusDirectSDK.triggerLogin(new SubVerifierDetails(LoginType.GOOGLE,"",new Auth0ClientOptions.Auth0ClientOptionsBuilder("").build()));
            TorusLoginResponse torusLoginResponse = torusLoginResponseCompletableFuture.get();
            TorusverifierUnionResponse userInfo = torusLoginResponse.getUserInfo();
            Log.d(TorusDirectPlugin.class.getSimpleName(),"Private Key: " + torusLoginResponse.getPrivateKey());
            Log.d(TorusDirectPlugin.class.getSimpleName(),"Public Address: " + torusLoginResponse.getPublicAddress());
            HashMap<String,String> torusLoginInfoMap = (HashMap<String,String> ) new HashMap<String,String>();
            torusLoginInfoMap.put("email",userInfo.getEmail());
            torusLoginInfoMap.put("name",userInfo.getName());
            torusLoginInfoMap.put("id",userInfo.getVerifierId());
            torusLoginInfoMap.put("profileImage",userInfo.getProfileImage());
            torusLoginInfoMap.put("privateKey",torusLoginResponse.getPrivateKey());
            torusLoginInfoMap.put("publicAddress",torusLoginResponse.getPublicAddress());

            result.success(torusLoginInfoMap);


          } catch (ExecutionException | InterruptedException e) {
            e.printstacktrace();

          }
        });
      }
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    channel.setMethodCallHandler(null);
  }
}


我设置了使用“ setVerifierDetails”登录的选项,并使用“ triggerLogin”启动了包含这些详细信息的登录窗口。触发登录调用函数以使用应用程序上下文和活动在浏览器中启动登录窗口:

   @Override
    public CompletableFuture<LoginWindowResponse> handleLoginWindow(Context context) {
        if (StartUpActivity.loginHandler != null && StartUpActivity.loginHandler.get() == null) {
            StartUpActivity.loginHandler.set(this);
        }
        Intent intent = new Intent(context,StartUpActivity.class).putExtra(StartUpActivity.URL,finalURL);
        context.startActivity(intent);
        return loginWindowResponseCompletableFuture;
    }

我能够启动意图并登录,但是,当我重定向回应用程序时,屏幕为空白。我以为启动浏览器时Flutter进程将被终止,但是我不确定。

这是AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.torus_direct_example">
    <!-- io.Flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startinitialization(this); in its onCreate method.
         In most cases you can leave this as-is,but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->
    <application
        android:name="io.Flutter.app.FlutterApplication"
        android:label="torus_direct_example"
        android:icon="@mipmap/ic_launcher"
        android:theme="@style/Theme.AppCompat.Light">
        <activity
            android:name=".MainActivity"
            android:launchMode="singletop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that,this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <Meta-data
              android:name="io.Flutter.embedding.android.normalTheme"
              android:resource="@style/normalTheme"
              />
            <!-- displays an Android View that continues showing the launch screen
                 Drawable until Flutter paints its first frame,then this splash
                 screen fades out. A splash screen is useful to avoid any visual
                 gap between the end of Android's launch screen and the painting of
                 Flutter's first frame. -->
            <Meta-data
              android:name="io.Flutter.embedding.android.SplashScreenDrawable"
              android:resource="@drawable/launch_background"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name="com.torusresearch.torusdirect.activity.StartUpActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar"
            android:launchMode="singletop">
            <intent-filter>
                 <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.broWSABLE"/>
                <data android:scheme="torusapp"
                    android:host="io.Flutter.app.FlutterApplication"
                    android:pathPattern="/*"
                    android:pathPrefix="/redirect"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the Meta-data below.
             This is used by the Flutter tool to generate GeneratedpluginRegistrant.java -->
        <Meta-data
            android:name="FlutterEmbedding"
            android:value="2" />
    </application>
</manifest>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)