Android 为什么我的AccountAuthenticatorActivity在被另一个应用程序触发时未启动?
我有一套应用程序,我的AccountManager文件位于一个中央应用程序中。我可以在该中心应用程序中使用AccountManager.AddAccount(),但当我尝试从其他应用程序中使用该方法时,AuthenticatorActivity未启动。我可以调试并看到AddAccount中的所有代码都在执行,但活动从未启动 以下是我的AddAccount方法:Android 为什么我的AccountAuthenticatorActivity在被另一个应用程序触发时未启动?,android,xamarin.android,android-manifest,accountmanager,Android,Xamarin.android,Android Manifest,Accountmanager,我有一套应用程序,我的AccountManager文件位于一个中央应用程序中。我可以在该中心应用程序中使用AccountManager.AddAccount(),但当我尝试从其他应用程序中使用该方法时,AuthenticatorActivity未启动。我可以调试并看到AddAccount中的所有代码都在执行,但活动从未启动 以下是我的AddAccount方法: public override Bundle AddAccount(AccountAuthenticatorResponse respo
public override Bundle AddAccount(AccountAuthenticatorResponse response, string accountType, string authTokenType, string[] requiredFeatures, Bundle options)
{
var intent = new Intent(_context, typeof(MyAccountAuthenticatorActivity));
intent.PutExtra(MyAccountAuthenticatorActivity.ARG_ACCOUNT_TYPE, accountType);
intent.PutExtra(MyAccountAuthenticatorActivity.ARG_AUTH_TYPE, authTokenType);
intent.PutExtra(MyAccountAuthenticatorActivity.ARG_IS_ADDING_NEW_ACCOUNT, true);
intent.PutExtra(AccountManager.KeyAccountAuthenticatorResponse, response);
var bundle = new Bundle();
bundle.PutParcelable(AccountManager.KeyIntent, intent);
return bundle;
}
我在所有应用程序中都使用相同的启动屏幕,因此调用AddAccount的代码是相同的
_accountManager = AccountManager.Get(this);
var accounts = _accountManager.GetAccountsByType(AccountKeys.ACCOUNT_TYPE);
//automatically add new account if no users on device yet
if (accounts.Length == 0)
{
_accountManager.AddAccount(AccountKeys.ACCOUNT_TYPE, AccountKeys.AUTH_TYPE, null, null, this, null, null);
CheckIfFirstRun();
Finish();
}
MyAccountAuthenticatorActivity位于一个应用程序中。如您所见,我将在正确的活动上下文中发送到AddAccount,但只有在拥有验证器文件的应用程序中执行这些代码时,才会调用StartActivity()
允许我的其他应用程序打开MyAccountAuthenticatorActivity,我还缺少什么?这可能与调用AddAccount时将回调设置为null有关吗?我不知道如何以另一种方式实现这一点,因为我不完全理解如何使用回调,因为没有一个java示例具有这种功能
我还尝试将MyAccountAuthenticatorActivity添加到我的其他应用程序的清单中,如下所示:
<activity android:name="com.redacted.authenticator.MyAccountAuthenticatorActivity" />
但这并没有改变任何事情。我知道其他应用程序正在查看AuthenticatorService,它们只是不会启动活动。因此我无法理解为什么
AddAccount()
不会启动活动本身,但我找到了解决方法。我自己也能处理好这个意图
这是我开始添加新帐户(从任何应用程序)的代码片段:
通过将AddAccount()
中的Activity
作为null
发送,所需的意图将以捆绑方式返回。然后我可以直接启动这个意图
我还需要将(Exported=true)
添加到我的AccountAuthenticatorActivity
的清单条目中。这允许其他应用程序启动该活动
var adapter = new AccountPickerArrayAdapter(this, accounts);
var builder = new AlertDialog.Builder(new ContextThemeWrapper(this, Resource.Style.AppTheme));
builder.SetTitle(Resource.String.choose_account);
builder.SetAdapter(adapter,
(s, a) =>
{
var dialog = (AlertDialog)s;
dialog.Dismiss();
GetExistingAuthToken(accounts[a.Which]);
FinishLogin(accounts[a.Which]);
});
builder.SetNeutralButton(Resource.String.add_new_account,
(s, e) =>
{
var dialog = (AlertDialog)s;
dialog.Dismiss();
var thread = new Thread(AddNewAccount);
thread.Start();
CheckIfFirstRun();
Finish();
});
builder.Create().Show();
}
void AddNewAccount()
{
var future = _accountManager.AddAccount(AccountKeys.ACCOUNT_TYPE, AccountKeys.AUTH_TYPE, null, null, null, null, null);
var bundle = future.Result as Bundle;
if (bundle != null)
{
var intent = bundle.GetParcelable(AccountManager.KeyIntent) as Intent;
StartActivity(intent);
}
}