The droids run 2.0, but the published Eclair source is 2.1 and that
was the fastest way to get an emulator that included the "Accounts &
Sync" settings that isn't in the 2.0 emulator.  AFAIK you'll need that
in order to affect any testing that will work on shipping 2.0 devices.

I don't have time to look into this any further at the moment as I'm
currently looking into the *next* issue which is the way in which the
contacts application handles contacts from account sources other than
the built-in Google and Exchange sources...

Cheers,
Jerry

On Dec 1, 8:02 pm, Dan Dumont <[email protected]> wrote:
> 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 <[email protected]> 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 <[email protected]>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 <[email protected]> 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 <[email protected]>
> >> 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 <[email protected]> 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 <[email protected]> wrote:
>
> >> > > > > I'm going to be trying it on a Droid this morning.
>
> >> > > > > On Nov 21, 10:07 pm, Dan Dumont <[email protected]> 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 <[email protected]>
> >> > > 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 <[email protected]>
> >> 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...
>
> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to