2010-06-28 4 views
3

Я пытаюсь иметь мое приложение отображать регистрационную деятельность, когда пользователь выбирает «Добавить учетную запись» в «Счета   &   Sync " или хочет использовать приложение и ещё не войти в систему. Я последовал примеру SampleSyncAdapter довольно близко, но не может заставить его работать и получить следующее исключение вместо:Нет активности не найдено для обработки Intent {акт = android.accounts.AccountAuthenticator}, даже если у меня есть один

No Activity found to handle Intent { act=android.accounts.AccountAuthenticator }

Моя служба аутентификации содержит:

public IBinder onBind(Intent intent) { 
    IBinder ret = null; 
    if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT)){ 
     ret = getAuthenticator().getIBinder(); 
    } 
    return ret; 
} 

Мои AndroidManifest.xml:

<service android:name=".auth.MyAuthService" 
     android:exported="true" 
     android:process=":auth"> 
    <intent-filter> 
     <action android:name="android.accounts.AccountAuthenticator" /> 
    </intent-filter> 

    <meta-data android:name="android.accounts.AccountAuthenticator" 
       android:resource="@xml/authenticator" 
    /> 

Моя основная деятельность:

startActivity(new Intent(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT)); 

Я пытался делать так:

Intent svc = new Intent(this, CreazaAuthService.class); 
startService(svc); 

и:

bindService(new Intent(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT), null, BIND_AUTO_CREATE); 

перед startActivity() вызова, но до сих пор не может найти активность для этого намерения. Если я попытаюсь добавить учетную запись через учетные записи &, то синхронизация моего приложения завершится с тем же ActivityNotFoundException.

Что я делаю неправильно?

EDIT
Я рассмотрел last.fm приложение C99, который определяет пользовательское действие и использует намерения на основе этого действия, а не android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT. Это лучший подход? Есть ли способ заставить его работать с учетной записью & Sync?

ответ

12

В вашем намерении добавить фильтр <category android:name="android.intent.category.DEFAULT" />

+0

Awesome. Спасибо! – juell

+0

Если вам интересно, _why_ это работает, оно зарыто в документации [Intents and Intent Filters] (http://developer.android.com/guide/components/intents-filters.html). «Android обрабатывает все неявные намерения, переданные startActivity(), как если бы они содержали по крайней мере одну категорию:« android.intent.category.DEFAULT »(константа CATEGORY_DEFAULT). Поэтому действия, желающие получить неявные намерения, должны включать« андроид ». intent.category.DEFAULT "в своих фильтрах намерений." –