Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
499 views
in Technique[技术] by (71.8m points)

authentication - Android SyncAdapter using a google account

I have written a SyncAdapter that takes a "com.google" account and performs a sync with an appengine web service. Testing this with the dev tools sync tester (on the emulator), this sync appears to work just fine.

The problem is, it's not syncing by default. And going to the account in "accounts & sync" shows my google account to be blank - as if there's no sync services available.

I suspect that in order to get my sync shown in the "accounts & sync" menu, I'd need to implement my own AccountAuthenticator that would do exactly the same thing as what I presume google's AccountAuthenticator must already do. This is not an exciting job, and it seems very unnecessary. So:

  • is there a way to add an entry to the "accounts & sync" menu that uses my SyncAdapter but relies on a google account? or to add a sub-menu to google accounts that enables sync of my appengine service?

if not,

  • is there a way I can re-use google's AccountAuthenticator from within an AccountAuthenticator I write?
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

So it turns out you can have a syncAdapter that uses a "com.google" account, but this requires you write a matching ContentProvider. For example, in AndroidManifest.xml:

<service android:name=".sync.SyncAdapterService" android:exported="true" android:process=":contacts">
  <intent-filter>
    <action android:name="android.content.SyncAdapter" />
  </intent-filter>
  <meta-data android:name="android.content.SyncAdapter" android:resource="@xml/syncadapter" />
</service>

and in syncadapter.xml:

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="net.gfxmonk.android.pagefeed"
    android:accountType="com.google"
    android:supportsUploading="false"
    android:userVisible="true"
/>

You then must have a ContentProvider with authority "net.gfxmonk.android.pagefeed" in order for android to associate that sync action with your application. Once you have this (it doesn't even need to do anything meaningful, just exist), your program can appear inside the "accounts & Sync" setting panel - within your chosen google account.

As an additional piece of work, you may need to call:

ContentResolver.setIsSyncable(account, "net.gfxmonk.android.pagefeed", 1)

with account as the Account object you want to use for your sync credentials.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...