6

我正在开发一个应用程序,它需要一个谷歌帐户才能获得某些选项。未检测到帐户时禁用选项,但我通过弹出窗口询问用户添加一个,如果用户单击是,则活动应该开始。显示全局“添加帐户”页面工作正常,但我想跳过那个不需要的额外步骤。毕竟,如果需要 Google 帐户,为什么要向某人提供添加 Exchange 帐户的选项,这只是令人困惑。所以我想默认使用新的 Google 帐户设置页面。

爪哇

try {
    Intent intent = new Intent();
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setClassName( "com.google.android.gsf", "com.google.android.gsf.login.AccountIntroActivity");

    //if(getApplicationContext().getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
        getApplicationContext().startActivity(intent);
    //} else {
        //getApplicationContext().startActivity(new Intent(Settings.ACTION_ADD_ACCOUNT).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
    //}
} catch ( ActivityNotFoundException e) {
    e.printStackTrace();
}

当我运行它时,会引发以下异常:

05-29 18:24:50.741: W/System.err(10875): android.content.ActivityNotFoundException: 找不到明确的活动类 {com.google.android.gsf/com.google.android.gsf.login.AccountIntroActivity }; 您是否在 AndroidManifest.xml 中声明了此活动?

Androidmanifest.xml

    <activity 
        android:name="com.google.android.gsf.login.AccountIntroActivity"/>   

问题:我在这里缺少什么?

编辑:

我尝试了另一种使用 addAccount 的方法,这不起作用,没有任何反应,没有引发错误,没有新的活动开始添加 Google 帐户。顺便说一句,原始版本中的整个 try catch 块都在 AlertDialog/ 侦听器中。

AccountManager acm = AccountManager.get();
acm.addAccount("com.google", null, null, null, null, null, null);           
4

2 回答 2

6

好的,使用 AccountManager 方式的问题是我在方法调用中根本没有使用 Activity 上下文,或者没有正确使用。考虑到它在 DialogInterface 中使用的事实,这是有效的:

private void popup() {
     AlertDialog.Builder helpBuilder = new AlertDialog.Builder(this);
     helpBuilder.setTitle("Add Gmail account");
     helpBuilder.setMessage("These options rely on a Gmail account, but you 
     don't seem to have one configured. Would you like to configure one now?");

     helpBuilder.setPositiveButton("Yes",
     new DialogInterface.OnClickListener() {
         //@Override
         public void onClick(DialogInterface dialog, int which) {
             //try/ catch block was here
             AccountManager acm = AccountManager.get(getApplicationContext());
             acm.addAccount("com.google", null, null, null, thisclassname.this, 
             null, null);
            }
     });

     helpBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
             // close the dialog, return to activity
         }
     });    

     AlertDialog helpDialog = helpBuilder.create();
     helpDialog.show();
}//end method

这可能需要更多的工作才能真正使用配置的帐户名,但现在,这回答了问题。

可悲的是,这需要许可,但我想事情就是这样

于 2012-05-31T21:06:01.903 回答
4

您实际上是在尝试使用私有 API——添加 Google 帐户活动的类名可能会更改,或者在不同的 Android 版本上可能已经不同。它位于 Google 服务包之一中,您当然不应该将其名称添加到清单中。简而言之,这是一个 hack,不要这样做。对您不起作用AccountManager.addAcount("com.google",...)(您需要MANAGE_ACCOUNTS许可)?

于 2012-05-30T02:39:20.937 回答