Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从AccountManager中删除帐户不会';t将用户发送到AccountAuthenticator活动_Android_Authentication_Android Service_Accountmanager_Android Authenticator - Fatal编程技术网

Android 从AccountManager中删除帐户不会';t将用户发送到AccountAuthenticator活动

Android 从AccountManager中删除帐户不会';t将用户发送到AccountAuthenticator活动,android,authentication,android-service,accountmanager,android-authenticator,Android,Authentication,Android Service,Accountmanager,Android Authenticator,我有一个使用AccountManager和自定义AccountAuthenticator注册用户的应用程序 我需要实现注销功能 当用户单击注销按钮时,他们的帐户被成功删除,但活动保持不变,用户不会被重定向到AccountAuthenticator活动,尽管如果我关闭应用程序并再次打开它,它将显示身份验证屏幕(即,帐户实际上已被删除) 我的问题: 我必须自己执行重定向(使用finish();startActivity(…);)还是验证器和AccountManager应该为我处理它(因为我认为如果它

我有一个使用AccountManager和自定义AccountAuthenticator注册用户的应用程序

我需要实现
注销
功能

当用户单击
注销
按钮时,他们的帐户被成功删除,但活动保持不变,用户不会被重定向到
AccountAuthenticator活动
,尽管如果我关闭应用程序并再次打开它,它将显示身份验证屏幕(即,帐户实际上已被删除)

我的问题: 我必须自己执行重定向(使用
finish();startActivity(…);
)还是验证器和AccountManager应该为我处理它(因为我认为如果它被声明为服务,它应该)


也许我必须实现某种帐户删除侦听器

无论如何,以下是我在
MainActivity
中删除帐户的方法:

    private void performLogout() {
        Account[] accounts = accountManager.getAccountsByType(AccountGeneral.ACCOUNT_TYPE);
        if (accounts.length != 0) {    
            accountManager.clearPassword(accounts[0]);
            accountManager.invalidateAuthToken(AccountGeneral.ACCOUNT_TYPE,
                    accountManager.getAuthToken(accounts[0], AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS, null, true,
                            accountManagerFuture -> {
                                try {
                                    Log.d("invalidateAuthToken", accountManagerFuture.getResult().toString());
                                } catch (android.accounts.OperationCanceledException | AuthenticatorException | IOException e) {
                                    e.printStackTrace();
                                }
                            }, null).toString());

            if (Build.VERSION.SDK_INT < 23) { // use deprecated method
              accountManager.removeAccount(accounts[0], accountManagerFuture -> {
                  try {
                      if (accountManagerFuture.getResult()) {
                          Log.d("Deprecated ACCOUNT REMOVAL", "ACCOUNT  REMOVED");

                      }
                  } catch (android.accounts.OperationCanceledException | IOException | AuthenticatorException e) {
                      e.printStackTrace();
                  }
              }, null);
          } else {
              accountManager.removeAccount(accounts[0], this, accountManagerFuture -> {
                  try {
                      if (accountManagerFuture.getResult() != null) {
                          Log.d("ACCOUNT REMOVAL", "ACCOUNT REMOVED");
                      }
                  } catch (android.accounts.OperationCanceledException | AuthenticatorException | IOException e) {
                      e.printStackTrace();
                  }
              }, null);
          }
        }
    }
在我的清单中,我以以下方式声明了服务:

<service
    android:name=".authenticator.DiscountyAuthenticationService"
    android:process=":auth">
    <intent-filter>
        <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data android:name="android.accounts.AccountAuthenticator"
        android:resource="@xml/authenticator" />
</service>



那么,我是否必须手动重定向用户,或者我需要改进代码中的某些内容,使AccountManager为我处理重定向?

删除帐户时,AccountManager不会启动其他帐户设置。如果您想要这种行为,您需要自己实现它

然而,我不建议这样实施。如果您单击“注销”,您不希望再次直接重定向到登录屏幕

相反,我会显示一条类似“成功注销”的成功消息,其中有两个按钮,一个表示“关闭”并关闭应用程序,另一个表示“再次登录”,将用户再次带到登录屏幕。这对用户更友好,伊姆霍

无论如何,要回答您的问题:如果您想自动进入登录屏幕,我会看到以下选项:

  • 只要在用户点击“注销”时启动帐户设置(使用)(可以选择使用删除帐户)。删除(您自己的应用程序的)帐户不太可能失败(特别是如果您在
    getAccountRemovalAllowed(…)
    中允许return
    true
    ),因此在大多数情况下,假设删除成功应该是安全的。验证器必须处理帐户已经存在的情况,因为用户可以随时启动帐户设置

  • 等待
    accountManagerFuture.getResult()
    ,然后像在#1中一样启动帐户设置,前提是它返回成功

  • 在您的活动中注册一个using,以检查该帐户是否存在。请注意,有三个触发器导致调用此侦听器:

    a。已创建帐户,包括其他应用的帐户

    b。已删除一个帐户,包括其他应用程序的帐户

    c。帐户的密码已更新,还包括其他应用程序的帐户(IMHO此事件应为身份验证人私有,绝对不应广播)

    但是,回调将不会收到任何关于触发器是什么的信息。因此,如果您的帐户被删除,您需要了解您自己


  • 还要注意,代码似乎在主线程中调用了
    accountManagerFuture.getResult()
    ,这不是一个好主意,因为它可能会阻塞。的文档明确指出这是不允许的。即使您在
    AccountManagerCallback
    回调中调用它,并且您可能认为调用它是安全的,我也不会依赖它,而是确保它在后台线程中执行。如果您不让用户确认删除,您可能应该打电话。

    删除帐户时,AccountManager不会启动另一个帐户设置。如果您想要这种行为,您需要自己实现它

    然而,我不建议这样实施。如果您单击“注销”,您不希望再次直接重定向到登录屏幕

    相反,我会显示一条类似“成功注销”的成功消息,其中有两个按钮,一个表示“关闭”并关闭应用程序,另一个表示“再次登录”,将用户再次带到登录屏幕。这对用户更友好,伊姆霍

    无论如何,要回答您的问题:如果您想自动进入登录屏幕,我会看到以下选项:

  • 只要在用户点击“注销”时启动帐户设置(使用)(可以选择使用删除帐户)。删除(您自己的应用程序的)帐户不太可能失败(特别是如果您在
    getAccountRemovalAllowed(…)
    中允许return
    true
    ),因此在大多数情况下,假设删除成功应该是安全的。验证器必须处理帐户已经存在的情况,因为用户可以随时启动帐户设置

  • 等待
    accountManagerFuture.getResult()
    ,然后像在#1中一样启动帐户设置,前提是它返回成功

  • 在您的活动中注册一个using,以检查该帐户是否存在。请注意,有三个触发器导致调用此侦听器:

    a。已创建帐户,包括其他应用的帐户

    b。已删除一个帐户,包括其他应用程序的帐户

    c。帐户的密码已更新,还包括其他应用程序的帐户(IMHO此事件应为身份验证人私有,绝对不应广播)

    但是,回调将不会收到任何关于触发器是什么的信息。因此,如果您的帐户被删除,您需要了解您自己

  • 还要注意,代码似乎在主线程中调用了
    accountManagerFuture.getResult()
    ,这不是一个好主意,因为它可能会阻塞。的文档明确指出这是不允许的。即使你在
    AccountMa中调用它
    
    <service
        android:name=".authenticator.DiscountyAuthenticationService"
        android:process=":auth">
        <intent-filter>
            <action android:name="android.accounts.AccountAuthenticator" />
        </intent-filter>
        <meta-data android:name="android.accounts.AccountAuthenticator"
            android:resource="@xml/authenticator" />
    </service>