Ok, thanks.

I guess, I stick to URL-safe Base64 since it currently works well for
me.

Regards

Marten

On 17 Feb., 01:59, Dmitri Plotnikov <dplotni...@google.com> wrote:
> Hi Marten,
>
> I have verified that in the current code base a source ID with special
> characters works fine.  Not really sure when it was fixed - most likely in
> FroYo.
>
> Since it sounds like you need for your sync adapter to run on Eclair and you
> have already discovered that special characters did not work back then, you
> should probably find a format for the source ID that would not be affected
> by URI encoding.  For example, you could consider using your URL,
> but escaping the offending characters in the sync adapter, before storing
> them in Contacts.  For example, you could replace space with _20, slash
> with _2F etc.  This way the string would pass through all URI
> encoding/decoding in the system.
>
> Cheers,
> - Dmitri
>
> On Sat, Feb 12, 2011 at 12:10 PM, marten <marten.ga...@googlemail.com>wrote:
>
> > Hi Dmitri,
>
> > thanks for your answer. Because my first mail took a few days until it
> > appeared on this list I reported this bug myself:
> >http://code.google.com/p/android/issues/detail?id=14505
> > You may want to mark it as duplicate.
>
> > I still have a question regarding this issue: Are other characters
> > that I should avoid in account names (e.g. ":" "/" "%")?
>
> > And I also have another (maybe related) issue. This one is in Android
> > 2.1 already (I could not check 2.2 or 2.3)
>
> > When I create a contact I do this with the following code:
>
> > ContentProviderOperation.Builder builder =
> > ContentProviderOperation.newInsert(mRawEntityUri);
> > builder.withValue(RawContacts.ACCOUNT_TYPE, mAccountType);
> > builder.withValue(RawContacts.ACCOUNT_NAME, mAccountName);
> > builder.withValue(DATA_SOURCE, source);
> > builder.withValue(DATA_ETAG, etag);
> > mOperations.add(builder.build());
>
> > upon a sync I update it with something like:
>
> > ContentProviderOperation.Builder builder =
> > ContentProviderOperation.newUpdate(mRawEntityUri);
> > builder.withSelection(ContactsContract.RawContacts._ID + "=?", new
> > String[] { String.valueOf(mRawContactId) });
> > builder.withValue(DATA_SOURCE, source);
> > builder.withValue(DATA_ETAG, etag);
> > builder.withValue(RawContacts.DIRTY, 0);
> > builder.withValue(RawContacts.DELETED, 0);
> > mOperations.add(builder.build());
>
> > where DATA_SOURCE = RawContacts.SOURCE_ID and DATA_ETAG =
> > RawContacts.SYNC1
>
> > and "source" is the full URI to a CardDav resource. So it looks like:
> >https://servername.dom:port/path/to/vcard/123456-7890-abc.vcf
>
> > The insert operations work fine, but if I update a contact I get the
> > following exception when I try to open a contact in the contact app (I
> > obfuscated the host name):
>
> > I/ActivityManager(   59): Starting activity: Intent
> > { act=android.intent.action.VIEW dat=content://com.android.contacts/
> > contacts/lookup/46ehttps://xxx..xxxxxxx..xxx:8443/caldav..php/test/
> > addresses/C4A77B71-9880-0001-10C2-4CE11DE076B0..vcf/1408 }
> > D/AndroidRuntime( 5887): Shutting down VM
> > W/dalvikvm( 5887): threadid=3: thread exiting with uncaught exception
> > (group=0x4001b188)
> > E/AndroidRuntime( 5887): Uncaught handler: thread main exiting due to
> > uncaught exception
> > E/AndroidRuntime( 5887): android.content.ActivityNotFoundException: No
> > Activity found to handle Intent { act=android.intent.action.VIEW
> > dat=content://com.android.contacts/contacts/lookup/46ehttps://
> > xxx..xxxxxxx..xxx:8443/caldav..php/test/addresses/
> > C4A77B71-9880-0001-10C2-4CE11DE076B0..vcf/1408 }
> > E/AndroidRuntime( 5887):        at
> > android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:
> > 1408)
> > E/AndroidRuntime( 5887):        at
> > android.app.Instrumentation.execStartActivity(Instrumentation.java:
> > 1378)
> > E/AndroidRuntime( 5887):        at
> > android.app.Activity.startActivityFromChild(Activity.java:2989)
> > E/AndroidRuntime( 5887):        at
> > android.app.Activity.startActivityForResult(Activity.java:2769)
> > E/AndroidRuntime( 5887):        at
>
> > com.android.contacts.ContactsListActivity.onListItemClick(ContactsListActivity.java:
> > 1258)
> > E/AndroidRuntime( 5887):        at android.app.ListActivity
> > $2.onItemClick(ListActivity.java:312)
> > E/AndroidRuntime( 5887):        at
> > android.widget.AdapterView.performItemClick(AdapterView.java:284)
> > E/AndroidRuntime( 5887):        at
> > android.widget.ListView.performItemClick(ListView.java:3285)
> > E/AndroidRuntime( 5887):        at android.widget.AbsListView
> > $PerformClick.run(AbsListView.java:1640)
> > E/AndroidRuntime( 5887):        at
> > android.os.Handler.handleCallback(Handler.java:587)
> > E/AndroidRuntime( 5887):        at
> > android.os.Handler.dispatchMessage(Handler.java:92)
> > E/AndroidRuntime( 5887):        at android.os.Looper.loop(Looper.java:123)
> > E/AndroidRuntime( 5887):        at
> > android.app.ActivityThread.main(ActivityThread.java:4363)
> > E/AndroidRuntime( 5887):        at
> > java.lang.reflect.Method.invokeNative(Native Method)
> > E/AndroidRuntime( 5887):        at
> > java.lang.reflect.Method.invoke(Method.java:521)
> > E/AndroidRuntime( 5887):        at com.android.internal.os.ZygoteInit
> > $MethodAndArgsCaller.run(ZygoteInit.java:860)
> > E/AndroidRuntime( 5887):        at
> > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
> > E/AndroidRuntime( 5887):        at dalvik.system.NativeStart.main(Native
> > Method)
>
> > if i omit the line
>
> > builder.withValue(DATA_SOURCE, source);
>
> > in the update code, it works and in the logs I see something like:
>
> > I/ActivityManager(   59): Starting activity: Intent
> > { act=android.intent.action.VIEW dat=content://com.android.contacts/
> > contacts/lookup/46ehttps%3A%2F%2Fxxx..xxxxxxx..xxx%3A8443%2Fcaldav..php
> > %2Ftest%2Faddresses%2FC4A480D3-FB20-0001-40C5-3CC0146EA520..vcf/1406
> > cmp=com.android.contacts/.ViewContactActivity }
>
> > notice the encoded URL this time! I suspect this is another case of an
> > URI encoding problem.
>
> > It seems like my only option is to encode the source with URI-Safe
> > Base64 (which works fine so far).
>
> > Can you confirm this as an Android bug?
>
> > cheers
>
> > Marten
>
> > On 4 Feb., 05:04, Dmitri Plotnikov <dplotni...@google.com> wrote:
> > > Hi Marten,
>
> > > I have filed an internal bug for this and will fix it right away.
>
> > > There is no apparent workaround.  I guess people normally don't run into
> > > this because most account names are e-mail addresses and thus don't
> > contain
> > > spaces.
>
> > > Thank you very much for reporting.
> > > - Dmitri
>
> > > On Tue, Feb 1, 2011 at 10:40 AM, Marten Gajda <marten.ga...@freenet.de
> > >wrote:
>
> > > > Hello,
>
> > > > there seems to be any change from Android 2.1 to Android 2.2 which
> > > > throws an Exception when contact account names have spaces.
> > > > I use the following code:
>
> > > > mEntityUri = ContactsContract.Groups.CONTENT_URI.buildUpon()
> > > >    .appendQueryParameter(ContactsContract.Groups.ACCOUNT_NAME,
> > > > mAccountName)
> > > >    .appendQueryParameter(ContactsContract.Groups.ACCOUNT_TYPE,
> > > > mAccountType)
> > > >    .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER,
> > "true")
> > > >    .build();
>
> > > > and later (with the same values):
>
> > > > ContentProviderOperation.Builder builder =
> > > > ContentProviderOperation.newInsert(mEntityUri);
> > > > Log.v(TAG, "create accountgroup: "+mAccountType+", "+mAccountName);
> > > > builder.withValue(ContactsContract.Groups.ACCOUNT_TYPE, mAccountType);
> > > > builder.withValue(ContactsContract.Groups.ACCOUNT_NAME, mAccountName);
> > > > builder.withValue(ContactsContract.Groups.SYSTEM_ID, mAccountName);
> > > > builder.withValue(ContactsContract.Groups.TITLE, mAccountName);
> > > > builder.withValue(ContactsContract.Groups.GROUP_VISIBLE, 1);
> > > > mBatchOperation.add(builder.build());
>
> > > > mBatchOperation.execute(); // this is line 133 in GroupManager.java
>
> > > > On Android 2.1 this code works fine on Android 2.2 this works fine as
> > > > long as there are no spaces in mAccountName.
> > > > If there are spaces the following Exception is thrown:
>
> > > > java.lang.IllegalArgumentException: When both specified, ACCOUNT_NAME
> > > > and ACCOUNT_TYPE must match; URI:
>
> > content://com.android.contacts/groups?account_name=Home%20Address%20Book&account_type=org.dmfs.carddav.account&caller_is_syncadapter=true,
> > > > calling user: org.dmfs.carddav.sync, calling
> > package:org.dmfs.carddav.sync
> > > > at
>
> > android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:144)
> > > > at
>
> > android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:137)
> > > > at
>
> > android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:491)
> > > > at
>
> > android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:95)
> > > > at android.content.ContentResolver.applyBatch(ContentResolver.java:622)
> > > > at org.dmfs.contacts.BatchOperations.execute(BatchOperations.java:54)
> > > > at org.dmfs.contacts.GroupManager.execute(GroupManager.java:133)
> > > > at
>
> > org.dmfs.carddav.syncadapter.SyncAdapter.onPerformSync(SyncAdapter.java:124)
> > > > at
>
> > android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:163)
>
> > > > BatchOperations is implemented like in sampleSyncAdapter.
>
> > > > resolveAccount from ContactsProvider2.java uses a different check now,
> > > > maybe the "%20" is not properly replaced.
>
> > > > Is there a known work-around (aside from removing spaces in the account
> > > > name)?
>
> > > > cheers
>
> > > > Marten
>
> > > > --
> > > > 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
>
> > --
> > 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
>
> ...
>
> Erfahren Sie mehr »

-- 
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

Reply via email to