UnityPlayerActivity 未调用 onActivityResult
onActivityResult Not Being Called For UnityPlayerActivity
我没有太多为 Unity3d 创建 Java (.aar) 插件的经验,但我正在尝试通过此类插件使用 firebase 设置 google 身份验证。举一个我的问题的例子,我首先打开一个统一 android 应用程序,然后我 运行 下面的 c# 代码,并在我的显示器上弹出一个使用 google 登录的窗口.然后我选择了正确的 google 帐户,然后 google intent/activity 消失了,然后我没有收到任何关于 "onActivityResult" 已被调用的指示。没有发生任何错误,我无法对我选择的 google 帐户信息执行任何操作。
在下图中,我点击提交 -> 它会在下一张图片中打开 google 登录 activity -> 然后它 returns 返回到提交屏幕(关闭 google 登录 activity)。
我认为我的问题出在这一行:
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
本例中的 "activity" 是从下面的 c# 统一代码发送的 UnityPlayerActivity。我认为这是成功的,所以我的代码正在寻找 C# 统一代码中的 "onActivityResult" 方法,而不是 java 代码。任何帮助将不胜感激。如果您需要任何其他信息或屏幕截图,请告诉我。如果我是白痴请叫我出来
这是我从 C# 和 Unity3d 调用 Google 登录插件的代码:
AndroidJNIHelper.debug = true;
using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
activity_context = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
}
using (AndroidJavaClass pluginClass = new AndroidJavaClass("com.package.class")) {
if (pluginClass != null) {
GoogleSignInActivity = pluginClass.CallStatic<AndroidJavaObject>("instance");
GoogleSignInActivity.Call("SetContext", activity_context);
GoogleSignInActivity.Call("StartGoogleLogin", activity_context);
activity_context.Call("runOnUiThread", new AndroidJavaRunnable(() => {
GoogleSignInActivity.Call("ShowMessage", "You signed in as " + display_name);
}));
}
}
这是创建 Google 登录的代码 Activity:
public void StartGoogleLogin(UnityPlayerActivity activity) {
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("some url")
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(activity, gso);
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
Log.d(TAG, "Activity Started; Waiting For Result");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "Result Received!");
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful
GoogleSignInAccount account = task.getResult(ApiException.class);
someMethod(account);
} catch (ApiException e) {
// Google Sign In failed, update UI appropriately
Log.d(TAG, "Google sign in failed", e);
}
setResult(RESULT_OK);
}
}
感谢您的宝贵时间。
好吧,我自己解决了让 Google 身份验证在 Android .aar 插件和 Unity c# 之间工作的问题。不知疲倦地工作,找到了一些 kickbutt 资源。
首先,我参考了一个叫cwgtech HERE的人写的代码。
他的videos我也都看过了。
我没有使用 UnitySendMessage,而是能够使用类似于 CWGTech 所做的回调方法将 googleIdToken 发送回 Unity 并使用 Google 登录到 Firebase。我认为我的错误在于以下陈述也是正确的:
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
我没有这样做,而是听从了 CWGTech 的建议并删除了 "activity." 部分。我 运行 扩展 Activity 的 ResultCallback class 中的 startActivityForResult。如果您仍然感到困惑,请私信我或对此发表评论 post。谢谢!
这里是我用来通过 Java 代理向 Unity 发送回调字符串的一些代码,用 C# 编写。有关编写 Java 代理的信息可以在上面的 cwgtech 信息中找到。如果您想获取从 Android 活动流向 Unity C# 的信息,那么编写 java 代理非常重要。 CWGTech 对 java 代理的错综复杂的解释比我能做的更好。
public static final String LOGTAG = GoogleSignInActivity.TAG + "_OnResult";
public static GoogleSignInActivity.ShareStringCallback shareStringCallback;
private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;
private GoogleSignInOptions gso;
private CallbackManager mCallbackManager;
public void myFinish(String myresult) {
if (shareStringCallback != null) {
shareStringCallback.onLoginComplete(myresult);
}
shareStringCallback = null;
finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(LOGTAG, "onCreateBundle");
Intent intent = getIntent();
setContentView(R.layout.login_activity);
findViewById(R.id.buttonFacebookLogin).setOnClickListener(this);
findViewById(R.id.signInButton).setOnClickListener(this);
findViewById(R.id.buttonAnonymousSignIn).setOnClickListener(this);
}
/* GOOGLE SIGN-IN CODE */
public Intent StartGoogleLogin() {
/*
Google Sign In Client Init Code Goes Here
*/
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
return signInIntent;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//Detects some type of result from an activity, in this case Google
String id_result = "Send This To Unity";
myFinish(id_result);
}
这是来自另一个 java class 文件的更多代码。 'Login' 方法从 Unity c# 调用。
/* INTERFACES FOR CALLBACK FUNCTIONAILITY */
public interface ShareStringCallback {
public void onLoginComplete(String result);
}
public void Login(final ShareStringCallback callback)
{
mainActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
Log.i(TAG,"Starting Authentication");
try {
try {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setClass(mainActivity,OnResultCallback.class);
OnResultCallback.shareStringCallback = callback;
mainActivity.startActivity(shareIntent);
}
catch (Exception e)
{
e.printStackTrace();
Log.i(TAG,"error sharing intent: " + e);
}
}
catch (Exception e)
{
e.printStackTrace();
Log.i(TAG,"Error getting Uri: " + e);
}
}
catch (Exception e)
{
e.printStackTrace();
Log.i(TAG,"Error writing file: " + e);
}
}
});
}
当您从 UnityPlayerActivity 启动 activity 时,onActivityResult 将在完成时调用,但将具有默认的 return 值。你可以做的是在 Android 中创建一个新的 Activity,并扩展 UnityPlayerActivity.
- 在 Android 中创建一个新的 Activity
import com.unity3d.player.UnityPlayer;
public class OverrideUnityPlayerActivity extends UnityPlayerActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public Activity getCurrentActivity(){
return mUnityPlayer.currentActivity;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
switch (resultCode) {
case Activity.RESULT_OK:
//do something
break;
case Activity.RESULT_CANCELED:
//do something
break;
}
}
}
}
- 您需要将此覆盖 activity 设置为 AndroidManifest.XML
中的启动端点
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="false"
tools:replace="android:allowBackup">
<activity
android:name="com.example.unitylibrary.manager.OverrideUnityPlayerActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="app_name" android:value="app_value"/>
</activity>
</application>
</manifest>
3.Then在Unity中,可以得到this activity和context,也可以得到onActivityResult
AndroidJavaObject overridePlayerActivity;
AndroidJavaObject overrideActivity;
public void init(){
overridePlayerActivity = new AndroidJavaObject("com.example.unitylibrary.manager.OverrideUnityPlayerActivity");
overrideActivity= overridePlayerActivity.Call<AndroidJavaObject>("getCurrentActivity");
}
public void startAct(){
anonymousFunction.Call("StartActForRes", overrideActivity);
}
希望这能解决您的问题。
我没有太多为 Unity3d 创建 Java (.aar) 插件的经验,但我正在尝试通过此类插件使用 firebase 设置 google 身份验证。举一个我的问题的例子,我首先打开一个统一 android 应用程序,然后我 运行 下面的 c# 代码,并在我的显示器上弹出一个使用 google 登录的窗口.然后我选择了正确的 google 帐户,然后 google intent/activity 消失了,然后我没有收到任何关于 "onActivityResult" 已被调用的指示。没有发生任何错误,我无法对我选择的 google 帐户信息执行任何操作。
在下图中,我点击提交 -> 它会在下一张图片中打开 google 登录 activity -> 然后它 returns 返回到提交屏幕(关闭 google 登录 activity)。
我认为我的问题出在这一行:
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
本例中的 "activity" 是从下面的 c# 统一代码发送的 UnityPlayerActivity。我认为这是成功的,所以我的代码正在寻找 C# 统一代码中的 "onActivityResult" 方法,而不是 java 代码。任何帮助将不胜感激。如果您需要任何其他信息或屏幕截图,请告诉我。如果我是白痴请叫我出来
这是我从 C# 和 Unity3d 调用 Google 登录插件的代码:
AndroidJNIHelper.debug = true;
using (AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) {
activity_context = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
}
using (AndroidJavaClass pluginClass = new AndroidJavaClass("com.package.class")) {
if (pluginClass != null) {
GoogleSignInActivity = pluginClass.CallStatic<AndroidJavaObject>("instance");
GoogleSignInActivity.Call("SetContext", activity_context);
GoogleSignInActivity.Call("StartGoogleLogin", activity_context);
activity_context.Call("runOnUiThread", new AndroidJavaRunnable(() => {
GoogleSignInActivity.Call("ShowMessage", "You signed in as " + display_name);
}));
}
}
这是创建 Google 登录的代码 Activity:
public void StartGoogleLogin(UnityPlayerActivity activity) {
gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("some url")
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(activity, gso);
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
Log.d(TAG, "Activity Started; Waiting For Result");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "Result Received!");
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful
GoogleSignInAccount account = task.getResult(ApiException.class);
someMethod(account);
} catch (ApiException e) {
// Google Sign In failed, update UI appropriately
Log.d(TAG, "Google sign in failed", e);
}
setResult(RESULT_OK);
}
}
感谢您的宝贵时间。
好吧,我自己解决了让 Google 身份验证在 Android .aar 插件和 Unity c# 之间工作的问题。不知疲倦地工作,找到了一些 kickbutt 资源。
首先,我参考了一个叫cwgtech HERE的人写的代码。
他的videos我也都看过了。
我没有使用 UnitySendMessage,而是能够使用类似于 CWGTech 所做的回调方法将 googleIdToken 发送回 Unity 并使用 Google 登录到 Firebase。我认为我的错误在于以下陈述也是正确的:
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
我没有这样做,而是听从了 CWGTech 的建议并删除了 "activity." 部分。我 运行 扩展 Activity 的 ResultCallback class 中的 startActivityForResult。如果您仍然感到困惑,请私信我或对此发表评论 post。谢谢!
这里是我用来通过 Java 代理向 Unity 发送回调字符串的一些代码,用 C# 编写。有关编写 Java 代理的信息可以在上面的 cwgtech 信息中找到。如果您想获取从 Android 活动流向 Unity C# 的信息,那么编写 java 代理非常重要。 CWGTech 对 java 代理的错综复杂的解释比我能做的更好。
public static final String LOGTAG = GoogleSignInActivity.TAG + "_OnResult";
public static GoogleSignInActivity.ShareStringCallback shareStringCallback;
private static final int RC_SIGN_IN = 9001;
private GoogleSignInClient mGoogleSignInClient;
private GoogleSignInOptions gso;
private CallbackManager mCallbackManager;
public void myFinish(String myresult) {
if (shareStringCallback != null) {
shareStringCallback.onLoginComplete(myresult);
}
shareStringCallback = null;
finish();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(LOGTAG, "onCreateBundle");
Intent intent = getIntent();
setContentView(R.layout.login_activity);
findViewById(R.id.buttonFacebookLogin).setOnClickListener(this);
findViewById(R.id.signInButton).setOnClickListener(this);
findViewById(R.id.buttonAnonymousSignIn).setOnClickListener(this);
}
/* GOOGLE SIGN-IN CODE */
public Intent StartGoogleLogin() {
/*
Google Sign In Client Init Code Goes Here
*/
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
return signInIntent;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//Detects some type of result from an activity, in this case Google
String id_result = "Send This To Unity";
myFinish(id_result);
}
这是来自另一个 java class 文件的更多代码。 'Login' 方法从 Unity c# 调用。
/* INTERFACES FOR CALLBACK FUNCTIONAILITY */
public interface ShareStringCallback {
public void onLoginComplete(String result);
}
public void Login(final ShareStringCallback callback)
{
mainActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
Log.i(TAG,"Starting Authentication");
try {
try {
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setClass(mainActivity,OnResultCallback.class);
OnResultCallback.shareStringCallback = callback;
mainActivity.startActivity(shareIntent);
}
catch (Exception e)
{
e.printStackTrace();
Log.i(TAG,"error sharing intent: " + e);
}
}
catch (Exception e)
{
e.printStackTrace();
Log.i(TAG,"Error getting Uri: " + e);
}
}
catch (Exception e)
{
e.printStackTrace();
Log.i(TAG,"Error writing file: " + e);
}
}
});
}
当您从 UnityPlayerActivity 启动 activity 时,onActivityResult 将在完成时调用,但将具有默认的 return 值。你可以做的是在 Android 中创建一个新的 Activity,并扩展 UnityPlayerActivity.
- 在 Android 中创建一个新的 Activity
import com.unity3d.player.UnityPlayer;
public class OverrideUnityPlayerActivity extends UnityPlayerActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public Activity getCurrentActivity(){
return mUnityPlayer.currentActivity;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0) {
switch (resultCode) {
case Activity.RESULT_OK:
//do something
break;
case Activity.RESULT_CANCELED:
//do something
break;
}
}
}
}
- 您需要将此覆盖 activity 设置为 AndroidManifest.XML 中的启动端点
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="false"
tools:replace="android:allowBackup">
<activity
android:name="com.example.unitylibrary.manager.OverrideUnityPlayerActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="app_name" android:value="app_value"/>
</activity>
</application>
</manifest>
3.Then在Unity中,可以得到this activity和context,也可以得到onActivityResult
AndroidJavaObject overridePlayerActivity;
AndroidJavaObject overrideActivity;
public void init(){
overridePlayerActivity = new AndroidJavaObject("com.example.unitylibrary.manager.OverrideUnityPlayerActivity");
overrideActivity= overridePlayerActivity.Call<AndroidJavaObject>("getCurrentActivity");
}
public void startAct(){
anonymousFunction.Call("StartActForRes", overrideActivity);
}
希望这能解决您的问题。