6

特定のオプションのためにGoogleアカウントを必要とするアプリケーションを開発しています。アカウントが検出されない場合、オプションは無効になりますが、ポップアップを介してアカウントを追加するようにユーザーに提示しています。ユーザーが[はい]をクリックすると、アクティビティが開始されます。グローバルな[アカウントの追加]ページを表示することは問題なく機能していますが、余分な手順を実行するために呼び出されないページをスキップしたいと思います。結局のところ、Googleアカウントが必要な場合にExchangeアカウントを追加するオプションを誰かに提示するのはなぜですか、それは混乱を招くだけです。そのため、デフォルトで新しいGoogleアカウント設定ページを使用します。

Java

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アカウントの追加を開始する新しいアクティビティはありません。ちなみに、元のバージョンのtrycatchブロック全体は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

設定されたアカウント名を実際に使用できるようにするには、おそらくもう少し作業が必要ですが、今のところ、これはQに答えます。

悲しいことに、これには許可が必要ですが、それがまさにその通りだと思います

于 2012-05-31T21:06:01.903 に答える
4

プライベートAPIを効果的に使用しようとしています。Googleアカウントの追加アクティビティのクラス名が変更されているか、Androidのバージョンによってすでに異なっている可能性があります。これはGoogleサービスパッケージの1つに含まれているため、マニフェストにその名前を追加しないでください。要するに、これはハックです、それをしないでください。あなたのために働きませんAccountManager.addAcount("com.google",...)か(あなたはMANAGE_ACCOUNTS許可が必要です)?

于 2012-05-30T02:39:20.937 に答える