יצירת מאמת stub

המסגרת של מתאם הסנכרון מניחה שמתאם הסנכרון מעביר נתונים בין האחסון במכשיר המשויך לחשבון ולאחסון בשרת שדורשים גישה להתחברות. לכן, ש-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 ספק; אחרת, עברו לשיעור יצירת מתאם סנכרון.