2013-03-22 111 views
3

使用自定義AccountAuthenticator我有2個獨立的Android項目,一個是AbstractAccountAuthenticator的實施在設備管理用戶帳戶,另一種是推送應用程序應該從AccountAuthenticator獲得令牌,並使用它。與多個應用程序

AbstractAccountAuthenticator的實現工作,並在「設置」菜單中的「帳戶和同步」部分調用時添加帳戶,但是當我從推送應用程序調用addAccount()時,我得到「權限被拒絕:checkComponentPermission( )「和應用程序在那裏死去。

我不能提供太多的源代碼,因爲它不是我的力量,使其能夠上市,但我向你保證,他們在一個「獨立」的方式工作。

我從不同的應用程序中搜索了正確使用AccountManager的例子,但沒有找到任何例子。 freenode也沒有運氣。

我發現從AccountAuthenticator內部啓動活動(使用Intent.FLAG_NEW_TASK和context.startActivity(intent))會訣竅,但這意味着addAccount()不會返回到AccountManager,而我認爲這與開發指南不一致,因爲它違反了AccountManager使用流程。另一種方式是導出請求用戶憑據時使用的Acitivity。但我認爲這可能是一個安全問題,因爲它應該由AccountManager調用,而不是外部。

謝謝你對此有任何想法。

PS:

  • 所有的權限被正確地使用,除非我需要一個特殊的一個,我不知道整個應用程序的工作。

  • 我會問,如果我可以使用的代碼片段顯示在這裏我很關心的線條。

  • 這裏第一個問題貼出來,我希望我沒有違反(米)的任何規則在這裏(我做搜索這裏和谷歌,但我問,因爲我發現沒有什麼用的。)

  • 謝謝您。


潛水到谷歌的登錄服務後,應設置類磕磕絆絆,我已經找到了我想應該是解決方案:

  • 不出口的東西,我一直在想這是一個安全問題來繞過您的實施,成爲服務或活動,繞過AccountManager。

  • 請勿在執行AbstractAccountAuthenticator時使用Intent.FLAG_NEW_TASKstartActivity(),因爲它會將您帶到意想不到的行爲。

做,這是非常簡單的方式,實際上是:

Intent i = new Intent(Settings.ACTION_ADD_ACCOUNT); 
i.putExtra(Settings.EXTRA_AUTHORITIES, new String[] { "com.exaple.yourauth" }); 
contextVar.startActivity(i); 

這樣,你所要求的設置,以提高可能的機構的名單一個新的帳戶,公交車,因爲你加入EXTRA_AUTHORITIES參數,一個有權限顯示的字符串,它將選項限制爲你想要的。如果只有一個符合您的額外要求,則會以適當的方式調用客戶經理和登錄活動。

我真的希望這可以幫助周圍的任何其他人。

回答

7

潛水到谷歌的登錄服務後,應設置類磕磕絆絆,我已經找到了我想應該是解決方案:

  • 不出口的東西,我一直在想這是一個安全問題調用的東西您的實施,成爲一項服務或活動,繞過AccountManager。

  • 請勿在執行AbstractAccountAuthenticator時使用Intent.FLAG_NEW_TASKstartActivity(),因爲它會將您帶到意想不到的行爲。

做,這是非常簡單的方式,實際上是:

Intent i = new Intent(Settings.ACTION_ADD_ACCOUNT); 
i.putExtra(Settings.EXTRA_AUTHORITIES, new String[] { "com.exaple.yourauth" }); 
contextVar.startActivity(i); 

這樣,你所要求的設置,以提高可能的機構的名單一個新的帳戶,公交車,因爲你加入EXTRA_AUTHORITIES參數,一個有權限顯示的字符串,它將選項限制爲你想要的。如果只有一個符合您的額外要求,則會以適當的方式調用客戶經理和登錄活動。

我真的希望這可以幫助周圍的任何其他人。