问题描述
我正在开发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 (将#修改为@)