0

하나의 중앙 앱에 여러 가지 앱과 내 AccountManager 파일이 있습니다. 해당 중앙 애플 리케이션에서 AccountManager.AddAccount()를 사용할 수 있지만 다른 응용 프로그램에서 해당 메서드를 사용하려고하면 AuthenticatorActivity가 시작되지 않습니다. 디버그하여 AddAccount의 코드가 모두 실행되고 있지만 액티비티가 실행되지 않는다는 것을 알 수 있습니다. 내가 AddAccount이 동일 호출하는 코드, 그래서 내 애플 리케이션의 모두 같은 시작 화면을 사용다른 앱에서 내 AccountAuthenticatorActivity가 실행되지 않는 이유는 무엇입니까?

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로 설정하는 것이 가능할 수 있습니까? 자바 예제 중 아무도 이것을 가지고 있지 않기 때문에 콜백을 사용하는 방법을 완전히 이해하지 못하기 때문에이 방법을 다른 방법으로 이해할 수는 없습니다.

는 또한과 같이 내 다른 응용 프로그램의 매니페스트에 MyAccountAuthenticatorActivity를 추가하는 시도 :

<activity android:name="com.redacted.authenticator.MyAccountAuthenticatorActivity" /> 

을하지만 아무것도 변경되지 않습니다. 나는 다른 응용 프로그램이 AuthenticatorService를보고 있다는 것을 알고, 그들은 활동을 시작하지 않을 것입니다.

답변

0

그래서 AddAccount()이 활동 자체를 시작하지 않는 이유를 알 수 없었지만 해결 방법을 찾을 수있었습니다. 나는 그 의도를 직접 다룰 수 있었다.

이 내가 (모든 응용 프로그램에서) 새로운 계정을 추가하기 시작 내 코드입니다 :

  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); 
      } 
     } 

원하는 의도가 번들에 반환, AddAccount()Activitynull을 보내. 그러면 그 의도를 직접 시작할 수 있습니다.

AccountAuthenticatorActivity의 목록 항목에 (Exported = true)을 추가해야했습니다. 이렇게하면 다른 앱이 해당 활동을 시작할 수 있습니다.

관련 문제