I found out the source(s) of the my problem related to the Accounts: First, I had no SyncManager associated to my Account Authenticator (and Eclair doesn't seems to like that), so I added an empty one (after some thoughs, I think that I'll setup a more complete one in the future). Moreover, I was using a reference to a constant as an account type (android:label="@string/account_type"), I tried to set this value manually and everything works smoothly (android:label="ACCOUNT_UNIFIED_IM_TYPE").
So now, I'm just looking for some advices regarding the ContactsContract API ! :) -- David On Jun 14, 11:42 am, David Bidorff <[email protected]> wrote: > By the way, please excuse me for my bad english ;) > > -- > David > > On Jun 14, 11:40 am, David Bidorff <[email protected]> wrote: > > > > > Hi, > > > I'm creating my first Android application and I'm looking for a few > > advices on several subjects. The context is simple: my application > > connects itself to several Instant Messaging servers and it creates a > > RawContact in the Contact Provider each one for the contacts found on > > these servers. At this time, I got everything working, but I'm not > > fully satisfied on several points: > > > First point: AccountManager > > > I successfully managed to create an simple account authenticator that > > create a new account dedicated to my application. There is no real > > authentication behind it, it simply create an empty Account if needed, > > that's all. Everything works in an emulator v2.2, however, I can't > > even bind to my "AuthenticatorService" in an emulator v2.1-update1. > > > Here is the error I retrieve from the logcat: > > > DEBUG/AccountManagerService(64): bind attempt failed for Session: > > expectLaunch false, connected false, stats (0/0/0), lifetime 0.001, > > addAccount, accountType ACCOUNT_UNIFIED_IM_TYPE, requiredFeatures null > > > Here is the part of the AndroidManifest.xml related to that > > Authenticator: > > > <service > > android:name=".service.core.authenticator.AuthenticatorService" > > android:exported="true"> > > <intent-filter> > > <action > > android:name="android.accounts.AccountAuthenticator" /> > > </intent-filter> > > <meta-data > > android:name="android.accounts.AccountAuthenticator" > > android:resource="@xml/authenticator" /> > > </service> > > > And here is the content of the file named '/res/xml/ > > authenticator.xml': > > > <?xml version="1.0" encoding="utf-8"?> > > <account-authenticator > > xmlns:android="http://schemas.android.com/apk/ > > res/android" > > android:accountType="@string/account_type" > > android:icon="@drawable/unified_im_icon" > > android:smallIcon="@drawable/unified_im_icon" > > android:label="@string/app_name" > > /> > > > Second point: creating a RawContact > > > Once my Account is created (or retrieved), I try to add a new > > RawContact, but it seems to me that this process is reeeeaaaally slow, > > so I'm wondering if I do it the right way and if you have any tips > > that would allow my to speed it up. Here is my code: > > > ContentValues lValues = new ContentValues(); > > lValues.put(RawContacts.ACCOUNT_TYPE, lAccountType); > > lValues.put(RawContacts.ACCOUNT_NAME, lAccountName); > > Uri lRawContactUri = > > mService.getContentResolver().insert(RawContacts.CONTENT_URI, > > lValues); > > > Uri lDataUri = Uri.withAppendedPath(lRawContactUri, > > Data.CONTENT_DIRECTORY); > > > ContentValues[] lData = new ContentValues[2]; > > lData[0] = new ContentValues(); > > lData[0].put(Entity.RAW_CONTACT_ID, lContact.getSystemId()); > > lData[0].put(Entity.MIMETYPE, Im.CONTENT_ITEM_TYPE); > > lData[0].put(Im.PROTOCOL, > > ProtocolUtils.toSystemProtocol(pProtocol)); > > lData[0].put(Im.DATA, pHandle); > > > lData[1] = new ContentValues(); > > lData[1].put(Entity.RAW_CONTACT_ID, lContact.getSystemId()); > > lData[1].put(Entity.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); > > lData[1].put(StructuredName.DISPLAY_NAME, pDisplayName); > > > mService.getContentResolver().bulkInsert(lDataUri, lData); > > > (Yeah, I know, and I'm really sorry for the lack of documentation...) > > > Third point: reading a list of RawContacts > > > That's the point that I'm not really proud of, not that the process > > is slow, but I'm sure there is a away to make it simpler. Here is what > > I do: > > > 1 - First, I query the ContactManager in order to retrieve the _ID of > > all the RawContacts that matches my Account: > > Cursor lCursor = lResolver.query( > > RawContacts.CONTENT_URI, > > new String[] {RawContacts._ID}, > > RawContacts.ACCOUNT_NAME + "=? AND " + > > RawContacts.ACCOUNT_TYPE + > > "=?", > > new String[] {lAccountName, lAccountType}, > > null); > > > 2 - Then, for EACH RawContact I query the ContentManager in order to > > retrieve its IM data, and an other query in order to retrieve its > > Display Name: > > > Cursor lRawCursor = lResolver.query( > > lRawContactUri, > > new String[] {Im.PROTOCOL, Im.DATA}, > > Data.MIMETYPE + "=?", > > new String[] {Im.CONTENT_ITEM_TYPE}, > > null); > > > lRawCursor = lResolver.query( > > lRawContactUri, > > new String[] {StructuredName.DISPLAY_NAME}, > > Data.MIMETYPE + "=?", > > new String[]{StructuredName.CONTENT_ITEM_TYPE}, > > null); > > > So here are my main problems, I'm pretty sure that there are some tips > > that would allow me to do the same thing more efficiently, I just hope > > someone will be here to give me them ;) -- 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

