המסגרת של מתאם הסנכרון מניחה שמתאם הסנכרון מעביר נתונים בין האחסון במכשיר המשויך לחשבון ולאחסון בשרת שדורשים גישה להתחברות. לכן, ש-framework מצפה לכם לספק רכיב שנקרא 'מאמת חשבונות' כחלק מהסנכרון עם מתאם בלבד. הרכיב הזה מתחבר לחשבונות Android ולמסגרת האימות, שמספק ממשק סטנדרטי לטיפול בפרטי כניסה של משתמשים, כמו פרטי התחברות.
גם אם באפליקציה לא נעשה שימוש בחשבונות, עדיין צריך לספק רכיב לאימות חשבונות.
אם אתם לא משתמשים בחשבונות או בהתחברות לשרת, מאמת החשבונות מטפל במידע
המערכת מתעלמת ממנו, כך שתוכל לספק רכיב מאמת שמכיל שיטת stub
בפועל. צריך גם לספק Service
קשור
מאפשרת ל-framework של מתאם הסנכרון לקרוא לשיטות של מאמת החשבונות.
בשיעור הזה נסביר איך להגדיר את כל החלקים של מאמת ה-stub שצריך
לעמוד בדרישות של מסגרת מתאם הסנכרון. אם עליכם לספק תג
במכשיר לאימות חשבונות שמטפל בחשבונות משתמשים, צריך לקרוא את מאמרי העזרה של
AbstractAccountAuthenticator
הוספת רכיב של מאמת stub
כדי להוסיף לאפליקציה רכיב לאימות stub, צריך ליצור מחלקה שמרחיבה
AbstractAccountAuthenticator
, ואז תזהו את השיטות הנדרשות,
על ידי החזרת null
או על ידי הפעלת חריגה.
בקטע הקוד הבא מוצגת דוגמה למחלקה של מאמת החשבונות ב-stub:
Kotlin
/* * Implement AbstractAccountAuthenticator and stub out all * of its methods */ class Authenticator(context: Context) // Simple constructor : AbstractAccountAuthenticator(context) { // Editing properties is not supported override fun editProperties(r: AccountAuthenticatorResponse, s: String): Bundle { throw UnsupportedOperationException() } // Don't add additional accounts @Throws(NetworkErrorException::class) override fun addAccount( r: AccountAuthenticatorResponse, s: String, s2: String, strings: Array<String>, bundle: Bundle ): Bundle? = null // Ignore attempts to confirm credentials @Throws(NetworkErrorException::class) override fun confirmCredentials( r: AccountAuthenticatorResponse, account: Account, bundle: Bundle ): Bundle? = null // Getting an authentication token is not supported @Throws(NetworkErrorException::class) override fun getAuthToken( r: AccountAuthenticatorResponse, account: Account, s: String, bundle: Bundle ): Bundle { throw UnsupportedOperationException() } // Getting a label for the auth token is not supported override fun getAuthTokenLabel(s: String): String { throw UnsupportedOperationException() } // Updating user credentials is not supported @Throws(NetworkErrorException::class) override fun updateCredentials( r: AccountAuthenticatorResponse, account: Account, s: String, bundle: Bundle ): Bundle { throw UnsupportedOperationException() } // Checking features for the account is not supported @Throws(NetworkErrorException::class) override fun hasFeatures( r: AccountAuthenticatorResponse, account: Account, strings: Array<String> ): Bundle { throw UnsupportedOperationException() } }
Java
/* * Implement AbstractAccountAuthenticator and stub out all * of its methods */ public class Authenticator extends AbstractAccountAuthenticator { // Simple constructor public Authenticator(Context context) { super(context); } // Editing properties is not supported @Override public Bundle editProperties( AccountAuthenticatorResponse r, String s) { throw new UnsupportedOperationException(); } // Don't add additional accounts @Override public Bundle addAccount( AccountAuthenticatorResponse r, String s, String s2, String[] strings, Bundle bundle) throws NetworkErrorException { return null; } // Ignore attempts to confirm credentials @Override public Bundle confirmCredentials( AccountAuthenticatorResponse r, Account account, Bundle bundle) throws NetworkErrorException { return null; } // Getting an authentication token is not supported @Override public Bundle getAuthToken( AccountAuthenticatorResponse r, Account account, String s, Bundle bundle) throws NetworkErrorException { throw new UnsupportedOperationException(); } // Getting a label for the auth token is not supported @Override public String getAuthTokenLabel(String s) { throw new UnsupportedOperationException(); } // Updating user credentials is not supported @Override public Bundle updateCredentials( AccountAuthenticatorResponse r, Account account, String s, Bundle bundle) throws NetworkErrorException { throw new UnsupportedOperationException(); } // Checking features for the account is not supported @Override public Bundle hasFeatures( AccountAuthenticatorResponse r, Account account, String[] strings) throws NetworkErrorException { throw new UnsupportedOperationException(); } }
קישור של מאמת החשבונות ל-framework
כדי שמסגרת מתאם הסנכרון תוכל לגשת למאמת החשבונות שלך, עליך ליצור שירות עבורו. השירות הזה מספק אובייקט קישור של Android שמאפשר ל-framework כדי להפעיל את המאמת ולהעביר נתונים בין המאמת לבין ה-framework.
קטע הקוד הבא מראה איך להגדיר את הגבול Service
:
Kotlin
/** * A bound Service that instantiates the authenticator * when started. */ class AuthenticatorService : Service() { // Instance field that stores the authenticator object private lateinit var mAuthenticator: Authenticator override fun onCreate() { // Create a new authenticator object mAuthenticator = Authenticator(getApplicationContext()) } /* * When the system binds to this Service to make the RPC call * return the authenticator's IBinder. */ override fun onBind(intent: Intent?): IBinder = mAuthenticator.iBinder }
Java
/** * A bound Service that instantiates the authenticator * when started. */ public class AuthenticatorService extends Service { ... // Instance field that stores the authenticator object private Authenticator mAuthenticator; @Override public void onCreate() { // Create a new authenticator object mAuthenticator = new Authenticator(getApplicationContext()); } /* * When the system binds to this Service to make the RPC call * return the authenticator's IBinder. */ @Override public IBinder onBind(Intent intent) { return mAuthenticator.getIBinder(); } }
הוספת קובץ המטא-נתונים של המאמת
כדי לחבר את רכיב המאמת למתאם הסנכרון ולמסגרות של החשבון, צריך
מספקים את ה-framework עם מטא-נתונים שמתארים את הרכיב. מטא-נתונים אלה מצהירים על
סוג החשבון שיצרת למתאם הסנכרון והוא כולל רכיבים של ממשק המשתמש
שהמערכת מציגה אם רוצים שסוג החשבון יהיה גלוי למשתמש. להצהיר על כך
המטא-נתונים בקובץ XML שמאוחסן בספרייה /res/xml/
בפרויקט האפליקציה.
אפשר לתת כל שם לקובץ, אבל בדרך כלל הוא נקרא authenticator.xml
.
קובץ ה-XML הזה מכיל רכיב יחיד <account-authenticator>
כולל את המאפיינים הבאים:
-
android:accountType
-
המסגרת של מתאם הסנכרון דורשת שכל מתאם סנכרון יכלול סוג חשבון, באופן
של שם דומיין. ה-framework משתמש בסוג החשבון כחלק ממתאם הסנכרון
זיהוי פנימי. עבור שרתים המחייבים התחברות, יש לציין את סוג החשבון יחד עם
חשבון המשתמש נשלח לשרת כחלק מפרטי הכניסה.
גם אם השרת שלכם לא מחייב התחברות, עדיין צריך לספק את סוג החשבון. עבור השתמשו בשם דומיין שנמצא בשליטתכם. ה-framework משתמש בו כדי לנהל מתאם הסנכרון, הערך לא נשלח לשרת שלך.
-
android:icon
-
מצביע אל פריט שניתן לשרטוט
משאב שמכיל סמל. אם תהפוך את מתאם הסנכרון לגלוי על ידי ציון
מאפיין
android:userVisible="true"
ב-res/xml/syncadapter.xml
, צריך לספק את משאב הסמל הזה. היא מופיעה בקטע חשבונות של את אפליקציית ההגדרות במערכת. -
android:smallIcon
-
מצביע אל פריט שניתן לשרטוט
משאב שמכיל גרסה מוקטנת של הסמל. אפשר להשתמש במקור המידע הזה במקום
android:icon
בקטע חשבונות באפליקציית ההגדרות של המערכת, בהתאם לגודל המסך. -
android:label
-
מחרוזת שאפשר להתאים לשוק המקומי ומזהה את סוג החשבון למשתמשים. אם יוצרים את מתאם הסנכרון
מוצג על ידי ציון המאפיין
android:userVisible="true"
ב-res/xml/syncadapter.xml
, עליכם לספק את המחרוזת הזו. היא מופיעה הקטע חשבונות באפליקציית ההגדרות של המערכת, לצד הסמל שהגדרת עבור עם מאמת החשבונות.
בקטע הקוד הבא מוצג קובץ ה-XML עבור מאמת החשבונות שיצרתם קודם לכן:
<?xml version="1.0" encoding="utf-8"?> <account-authenticator xmlns:android="http://schemas.android.com/apk/res/android" android:accountType="example.com" android:icon="@drawable/ic_launcher" android:smallIcon="@drawable/ic_launcher" android:label="@string/app_name"/>
יש להצהיר על המאמת במניפסט
בשלב הקודם, יצרת Service
קשור שמקשר את מאמת החשבונות
למסגרת של מתאם הסנכרון. כדי לזהות את השירות הזה במערכת, צריך להצהיר עליו באפליקציה
באמצעות הוספת הטקסט הבא
<service>
בתור רכיב צאצא של
<application>
:
<service android:name="com.example.android.syncadapter.AuthenticatorService"> <intent-filter> <action android:name="android.accounts.AccountAuthenticator"/> </intent-filter> <meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator" /> </service>
<intent-filter>
מגדיר מסנן שמופעל על ידי פעולת Intent
android.accounts.AccountAuthenticator
, שנשלח על ידי המערכת כדי להריץ את
עם מאמת החשבונות. כשהמסנן מופעל, המערכת מפעילה את AuthenticatorService
,
ה-Service
המוגבל שסיפקת כדי לכווץ את מאמת החשבונות.
<meta-data>
הרכיב מצהיר על המטא-נתונים של המאמת.
android:name
מקשר את המטא-נתונים למסגרת האימות.
android:resource
מציין את שם קובץ המטא-נתונים של מאמת החשבונות שיצרתם קודם לכן.
מלבד מאמת החשבונות, נדרש גם ספק תוכן. אם האפליקציה לא כבר נעזרים בספק תוכן, עברו לשיעור הבא כדי ללמוד איך ליצור תוכן stub ספק; אחרת, עברו לשיעור יצירת מתאם סנכרון.