【问题标题】:How to display an activity for permission which starts from Status Bar Notification?如何显示从状态栏通知开始的权限活动?
【发布时间】:2020-07-09 04:43:35
【问题描述】:

我正在使用 AccountManager 获取 OAuth 2.0 令牌。

mAccountManager.getAuthToken(mAccount, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>() {
        @Override
        public void run(AccountManagerFuture<Bundle> future) {
                Bundle bundle = future.getResult();
                if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) {
                    String authToken = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
                    ... continue
                }
            }
        }
    }, null);

如果令牌是第一次获得,AccountManager 会在状态栏中显示一条通知,这会启动一个请求访问帐户权限的活动。

问题是,如何在不点击通知的情况下立即显示此活动?

【问题讨论】:

    标签: android accountmanager


    【解决方案1】:

    在这里找到解决方案:

    http://www.finalconcept.com.au/article/view/android-account-manager-using-other-accounts

    如果该页面消失,这是代码的副本:

    private final Handler handler = new Handler();  
    
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        final AccountManager accMgr;  
        final Account[] accounts;  
        final Account account;  
        final AccountManagerFuture<Bundle> amf;  
        final MainActivity cbt = this;  
        String authTokenType;  
    
        super.onCreate(savedInstanceState);  
    
        this.setContentView(R.layout.main);  
    
        accMgr = AccountManager.get(this);  
        authTokenType = "com.google";  
        accounts = accMgr.getAccountsByType(authTokenType);  
        account = accounts[2];  
    
        amf = accMgr.getAuthToken(account, authTokenType, true,  
                new AccountManagerCallback<Bundle>() {  
    
                    @Override  
                    public void run(AccountManagerFuture<Bundle> arg0) {  
    
                        try {  
                            Bundle result;  
                            Intent i;  
                            String token;  
    
                            result = arg0.getResult();  
                            if (result.containsKey(AccountManager.KEY_INTENT)) {  
                                i = (Intent)result.get(AccountManager.KEY_INTENT);  
                                if (i.toString().contains("GrantCredentialsPermissionActivity")) {  
                                    // Will have to wait for the user to accept  
                                    // the request therefore this will have to  
                                    // run in a foreground application  
                                    cbt.startActivity(i);  
                                } else {  
                                    cbt.startActivity(i);  
                                }  
    
                            } else {  
                                token = (String)result.get(AccountManager.KEY_AUTHTOKEN);  
    
                                /* 
                                 * work with token 
                                 */  
    
                                // Remember to invalidate the token if the web service rejects it  
                                // if(response.isTokenInvalid()){  
                                //    accMgr.invalidateAuthToken(authTokenType, token);  
                                // }  
    
                            }  
                        } catch (OperationCanceledException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        } catch (AuthenticatorException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        } catch (IOException e) {  
                            // TODO Auto-generated catch block  
                            e.printStackTrace();  
                        }  
    
                    }  
                }, handler);  
    
    }  
    

    这个页面也很有用:

    Google Account Authenticator asks for permission at run-time

    【讨论】:

    【解决方案2】:

    在大多数情况下,通知是从服务中使用的。如果您想立即显示活动,则无法从服务中执行此操作。但是,当您现在已经向用户显示应用程序的一项活动时,立即显示该活动是没有问题的。在这种情况下不需要通知,因此只需将“false”作为通知参数传递给 getAuthToken() 或调用签名中没有该参数的方法。如果您想知道,在什么情况下准确显示了该活动,下面是其中之一。

    简单地说,当调用 AccountManager.getAuthToken() 以访问在另一个应用程序中创建的帐户(具有另一个签名)时,就会出现此屏幕。要自动显示该视图,只需将活动传递给 AccountManager.getAuthToken() 或从收到的 KEY_INTENT 启动它,如 user979247 的回复中所建议的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多