Drat... I don't want to build 2.1... I thought the droids ran 2.0? anyway... I updated the project. Please let me know if it works :) I get an error still in the 2.0 emulator... 12-01 19:54:36.454: ERROR/AndroidRuntime(93): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.settings.SYNC_SETTINGS (has extras) }
On Tue, Dec 1, 2009 at 4:18 PM, Dan Dumont <ddum...@gmail.com> wrote: > I'll update my project asap! Thanks for looking into this!! > > when we create the binder, do we need to verify that the "account" variable > is for us? IE... will the intent be triggered for all providers, and we > must figure out if the info is our or not? > > > > On Mon, Nov 30, 2009 at 2:35 PM, Jerry Brady <jerry.br...@gmail.com>wrote: > >> Guys following this issue, >> >> I found the ultimate cause of the error and found a workaround that >> will allow you to work on a Droid. >> >> One thing that's helpful is building yourself an Eclair 2.1 SDK so you >> can use an emulator (2.1) that includes the "Accounts & Sync" settings >> option we need in working with accounts: >> >> ------------------------------------- >> From the the root of the android source tree: >> . build/envsetup.sh >> lunch sdk-eng >> make sdk (may want to use -j<something> based on your number of cores) >> >> find the SDK in out/host/linux/sdk/... >> >> From the SDK, copy platforms/android-#.# into your SDK/platform on >> your destination pc. >> >> If that's running windows, copy platforms/android-2.0/tools/* into >> your newly created platforms tools folder. >> >> Use the AVD Manager to create an AVD for this new platform. >> ----------------------------------------------- >> >> >> The crash is caused by an undocumented assumption in the Android code >> that handles accounts and sync. They are *very* closely related. It >> turns out that the "Accounts and Sync" settings plugin after getting >> the accounts on the system, uses the content service to scan for >> services on the system that implement the intent >> "android.content.SyncAdapter". >> >> Since our code doesn't implement this, the search came up empty handed >> and since the code assumed this would never happen, BAM, null pointer >> exception and crash. >> >> It turns out that the solution is to have your application (or >> something on the system) implement a service that catches the intent >> "android.content.SyncAdapter" that returns an IBinder to an object >> that extends AbstractThreadedSyncAdapter (just like we did for our >> AbstractAccountAuthenticator). >> >> I took examples from the source code for the Email application in >> android, but here are the relevant bits to setup an empty sync adapter >> for contacts that does nothing but gets you past the exception: >> >> AndroidManifest.xml: >> >> ---------------------------------------------------------------------------- >> <!--Required stanza to register the ContactsSyncAdapterService with >> SyncManager --> >> <service >> android:name="com.YOURDOMAIN.YOURAPP.ContactsSyncAdapterService" >> android:exported="true"> >> <intent-filter> >> <action android:name="android.content.SyncAdapter" /> >> </intent-filter> >> <meta-data android:name="android.content.SyncAdapter" >> android:resource="@xml/syncadapter_contacts" /> >> </service> >> >> xml/syncadapter_contacts - : >> >> -------------------------------------------------------------------------------- >> <sync-adapter xmlns:android="http://schemas.android.com/apk/res/ >> android" >> android:contentAuthority="com.android.contacts" >> android:accountType="com.YOURDOMAIN.YOURAPP" >> /> >> >> ContactSyncAdapter: >> ===================================== >> public class ContactsSyncAdapterService extends Service { >> private static final String TAG = "ContactsSyncAdapterService"; >> private static SyncAdapterImpl sSyncAdapter = null; >> private static final Object sSyncAdapterLock = new Object(); >> >> public ContactsSyncAdapterService() { >> super(); >> } >> >> private static class SyncAdapterImpl extends >> AbstractThreadedSyncAdapter { >> private Context mContext; >> >> public SyncAdapterImpl(Context context) { >> super(context, true /* autoInitialize */); >> mContext = context; >> } >> >> @Override >> public void onPerformSync(Account account, Bundle extras, >> String authority, ContentProviderClient provider, >> SyncResult syncResult) { >> try { >> ContactsSyncAdapterService.performSync(mContext, >> account, >> extras, >> authority, provider, syncResult); >> } catch (OperationCanceledException e) { >> } >> } >> } >> >> @Override >> public void onCreate() { >> super.onCreate(); >> synchronized (sSyncAdapterLock) { >> if (sSyncAdapter == null) { >> sSyncAdapter = new SyncAdapterImpl >> (getApplicationContext()); >> } >> } >> } >> >> @Override >> public IBinder onBind(Intent intent) { >> return sSyncAdapter.getSyncAdapterBinder(); >> } >> >> private static void performSync(Context context, Account account, >> Bundle extras, >> String authority, ContentProviderClient provider, >> SyncResult syncResult) >> throws OperationCanceledException { >> ContentResolver cr = context.getContentResolver(); >> Log.i(TAG, "performSync: " + account.toString()); >> } >> } >> >> On Nov 23, 8:46 pm, Dan Dumont <ddum...@gmail.com> wrote: >> > Nice, thanks for doing that! I'll star it, I hope we get a response >> soon. >> > >> > >> > >> > On Mon, Nov 23, 2009 at 5:32 PM, Jerry Brady <jerry.br...@gmail.com> >> wrote: >> > > Just filed a case for this: >> > >> > >http://code.google.com/p/android/issues/detail?id=5009 >> > >> > > On Nov 23, 1:47 pm, Jerry Brady <jerry.br...@gmail.com> wrote: >> > > > Dan, >> > >> > > > My code and yours both work on the Droid, but there are some nasty >> > > > side-effects. After adding an account with your application (or >> mine) >> > > > whenever you visit the "Accounts & Sync" settings screen, the system >> > > > crashes hard and reboots. >> > >> > > > 11-23 13:21:34.863: WARN/dalvikvm(1011): threadid=13: thread exiting >> > > > with uncaught exception (group=0x4001b180) >> > > > 11-23 13:21:34.863: ERROR/AndroidRuntime(1011): Uncaught handler: >> > > > thread android.server.ServerThread exiting due to uncaught exception >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): *** EXCEPTION IN >> > > > SYSTEM PROCESS. System will crash. >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): >> > > > java.lang.NullPointerException >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): at >> > > > com.android.settings.ManageAccountsSettings.onSyncStateUpdated >> > > > (ManageAccountsSettings.java:187) >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): at >> > > > com.android.settings.ManageAccountsSettings.onAccountsUpdated >> > > > (ManageAccountsSettings.java:244) >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): at >> > > > android.accounts.AccountManager$10.run(AccountManager.java:389) >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): at >> > > > android.os.Handler.handleCallback(Handler.java:587) >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): at >> > > > android.os.Handler.dispatchMessage(Handler.java:92) >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): at >> > > > android.os.Looper.loop(Looper.java:123) >> > > > 11-23 13:21:34.879: ERROR/AndroidRuntime(1011): at >> > > > com.android.server.ServerThread.run(SystemServer.java:428) >> > >> > > > I'm looking at the source now to see if I can figure out what's >> going >> > > > on. If necessary, I'll file a case with the project if I find a bug >> > > > in the Android source. >> > >> > > > Cheers, >> > > > Jerry >> > >> > > > On Nov 23, 8:18 am, Jerry Brady <jerry.br...@gmail.com> wrote: >> > >> > > > > I'm going to be trying it on a Droid this morning. >> > >> > > > > On Nov 21, 10:07 pm, Dan Dumont <ddum...@gmail.com> wrote: >> > >> > > > > > I get that exception in the emulator ( doesn't reboot though ) >> > >> > > > > > I thought it was due to missing pieces of the emulator... >> > >> > > > > > does logcat output anything? >> > >> > > > > > On Sat, Nov 21, 2009 at 7:07 PM, NitroDesk <gsuku...@gmail.com> >> > > wrote: >> > > > > > > Any of you folks tried this on a Droid? >> > > > > > > Simply installing the project that contains an Authenticator >> in the >> > > > > > > manfest and the other related items seems to cause the "Add >> > > Account" >> > > > > > > option in the account list on te droid to simply reoot the >> phone >> > > with >> > > > > > > an exception. >> > > > > > > Anyone else seen this or find a way to avoid this ? >> > > > > > > -g >> > >> > > > > > > On Nov 21, 9:04 am, Jerry Brady <jerry.br...@gmail.com> >> wrote: >> > > > > > > > Dan, >> > >> > > > > > > > Now I see what you are doing in your code and found the >> reference >> > > to >> > > > > > > > AddAccountExplicitly(). I want to skip returning an intent >> to >> > > fire >> > > > > > > > the an AccountAuthenticatorActivity and instead to return >> > > > > > > > KEY_ACCOUNT_NAME and KEY_ACCOUNT_TYPE directly from my >> > > > > > > > AbstractAccountAuthenticator's addAccount method whereas >> your >> > > code >> > > > > > > > returns an intent that fires your authentication activity. >> > >> > > > > > > > The main issue for me so far is that I don't see that my >> > > > > > > > AbstractAccountAuthenticator is ever being instantiated. >> > >> > > > > > > > Cheers, >> > > > > > > > Jerry >> > >> > > > > > > > On Nov 20, 7:53 am, Dan Dumont <ddum...@gmail.com> wrote: >> > >> > > > > > > > > Yes. But I make the AddAccountExplicitly call in my >> > > Authenticator. >> > > > > > > You >> > > > > > > > > use theAccountManagerto create accounts. >> > > > > > > > > If you call AddAccountExplicitly from a non-authenticator >> > > class, I >> > > > > > > guess it >> > > > > > > > > will work... But I think the security behind it will mean >> that >> > > only >> > > > > > > the >> > > > > > > > > class that created the account will be able to ever modify >> it >> > > or >> > > > > > > extract the >> > > > > > > > > password. >> > >> > > > > > > > > This is why they have a framework for you to get an >> authtoken >> > > returned >> > > > > > > via >> > > > > > > > > the authenticator... the logic for authenticating should >> be >> > > buried >> > > > > > > within >> > > > > > > > > there, because it will be the only class allowed to peak >> at the >> > > > > > > password and >> > > > > > > > > send it wherever you are authenticating. >> > >> > > > > > > > > On Fri, Nov 20, 2009 at 2:16 AM, sukumar bhashyam < >> > >> > > > > > > > > bhashyam.suku...@gmail.com> wrote: >> > > > > > > > > > AddAccountExplicitly() would need Authenticator of same >> type. >> > >> > > > > > > > > > I created an Authenticator and called >> AddAccountExplicitly() >> > > for the >> > > > > > > same >> > > > > > > > > > type which created an account ( Could verify it from >> > > > > > > > > >AccountManager.getAccounts()) >> > >> > > > > > > > > > One strange thing I observer is none of the >> implementation >> > > class >> > > > > > > functions >> > > > > > > > > > of AbstractAccountAuthenticator is being called. I >> followed >> > > the exact >> > > > > > > steps >> > > > > > > > > > in documentation. Not even onCreate or onBind function >> is >> > > called. >> > > > > > > Anyone >> > > > > > > > > > seen this problem?. Is your AbstractAccountAuthenticator >> > > > > > > implemetation class >> > > > > > > > > > being invoked?. >> > > > > > > > > > Thanks. >> > >> > > > > > > > > > On Thu, Nov 19, 2009 at 8:26 PM, Jerry Brady < >> > > jerry.br...@gmail.com >> > > > > > > >wrote: >> > >> > > > > > > > > >> Dan, >> > >> > > > > > > > > >> Thanks for all of this. I just returned to the office >> and >> > > will be >> > > > > > > > > >> taking a look to see how much further I can get and I >> will >> > > certainly >> > > > > > > > > >> be interested in helping with your accounts project. >> > >> > > > > > > > > >> I got as far as getting my account to show up in the >> list of >> > > > > > > accounts >> > > > > > > > > >> along with Google, Facebook and Exchange, but my >> service >> > > never gets >> > > > > > > > > >> called. My addAccount() method doesn't return an >> intent, >> > > but rather >> > > > > > > > > >> KEY_ACCOUNT_NAME and KEY_ACCOUNT_TYPE in it's bundle to >> let >> > > the >> > > > > > > > > >> account request succeed. >> > >> > > > > > > > > >> My goal is to create an account that will only be used >> by my >> > > > > > > > > >> application and does not need to have any features to >> enable >> > > > > > > external >> > > > > > > > > >> authentication or account configuration. >> > >> > > > > > > > > >> I've also tried AddAccountExplicitly() but I can't seem >> to >> > > get >> > > > > > > around >> > > > > > > > > >> its UID restrictions. The calling activity and the >> > > authenticator >> > > > > > > > > >> service all belong to the same application so I'm not >> sure >> > > why the >> > > > > > > > > >> system still throws an error about the UID not being >> > > correct. >> > >> > > > > > > > > >> Cheers, >> > > > > > > > > >> Jerry >> > >> > > > > > > > > >> On Nov 13, 11:54 pm, Dan Dumont <ddum...@gmail.com> >> wrote: >> > > > > > > > > >> > For anyone still interested. I've made a bit of >> > > progress. The >> > > > > > > > > >> google >> > > > > > > > > >> > project below now creates and lists accounts of the >> type >> > > for the >> > > > > > > > > >> project! >> > >> > > > > > > > > >> > On Fri, Nov 13, 2009 at 9:39 PM, Dan Dumont < >> > > ddum...@gmail.com> >> > > > > > > wrote: >> > > > > > > > > >> > > To facilitate the discussion around this topic, >> I've >> > > started up >> > > > > > > a >> > > > > > > > > >> project >> > > > > > > > > >> > > over here: >> > > > > > > > > >> > >http://code.google.com/p/androidaccounts/ >> > >> > > > > > > > > >> > > <http://code.google.com/p/androidaccounts/>If >> anyone is >> > > > > > > interested in >> > > > > > > > > >> > > pitching in and writing some examples, let me know >> so I >> > > can add >> > > > > > > you. >> > > > > > > > > >> > > The current state of the project is as far as I've >> > > gotten to >> > > > > > > > > >> understanding >> > > > > > > > > >> > > what is available so far... and I'm stumped as to >> why >> > > new >> > > > > > > accounts >> > > > > > > > > >> don't >> > > > > > > > > >> > > seem to persist after their creation ( as far as >> the >> > > > > > > AccountsTester >> > > > > > > > > >> app is >> > > > > > > > > >> > > concerned ). >> > >> > > > > > > > > >> > > On Fri, Nov 13, 2009 at 7:40 PM, Dan Dumont < >> > > ddum...@gmail.com> >> > > > > > > > > >> wrote: >> > >> > > > > > > > > >> > >> I've gotten a bit further than you. >> > >> > > > > > > > > >> > >> The account manager seems to want to store >> > > AccountName+Type >> > > > > > > pairs, >> > > > > > > > > >> and >> > > > > > > > > >> > >> have anAccountAuthenticatorhandle the storage and >> dirty >> > > bits of >> > > > > > > the >> > > > > > > > > >> actual >> > > > > > > > > >> > >> authentication and credential storage. >> > >> > > > > > > > > >> > >> You will need to create anAccountAuthenticatorfrom >> the >> > > > > > > > > >> > >> AbstractAccountAuthenticator class. >> > > > > > > > > >> > >> You will also need to define a Service in your >> app. >> > > See >> > >> > >http://developer.android.com/reference/android/accounts/AbstractAccou. >> .. >> > > > > > > > > >> > >> This service must be set up in the Manifest like >> so: >> > > (ripped >> > > > > > > from >> > > > > > > > > >> link >> > > > > > > > > >> > >> above) >> > >> > > > > > > > > >> > >> <intent-filter> >> > > > > > > > > >> > >> <action >> > > > > > > android:name="android.accounts.AccountAuthenticator" /> >> > > > > > > > > >> > >> </intent-filter> >> > > > > > > > > >> > >> <meta-data >> > > > > > > android:name="android.accounts.AccountAuthenticator" >> > > > > > > > > >> > >> android:resource="@xml/authenticator" >> /> >> > >> > > > > > > > > >> > >> You can take a look at the link for what the >> resource >> > > must >> > > > > > > be... >> > >> > > > > > > > > >> > >> After you end up hooking all that crap up, you can >> do >> > > this in... >> > >> > read more ยป >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Android Developers" group. >> To post to this group, send email to android-developers@googlegroups.com >> To unsubscribe from this group, send email to >> android-developers+unsubscr...@googlegroups.com<android-developers%2bunsubscr...@googlegroups.com> >> For more options, visit this group at >> http://groups.google.com/group/android-developers?hl=en >> > > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en