إنشاء تطبيق مصادقة للكعب

يفترض إطار عمل محوّل المزامنة أن محوّل المزامنة ينقل البيانات بين مساحة تخزين الجهاز. المرتبطة بمساحة تخزين على الحساب والخادم تتطلب تسجيل الدخول. لهذا السبب، أن تقدم مكونًا يُسمى برنامج المصادقة كجزء من عملية المزامنة محوّل. يتم توصيل هذا المكوّن بحسابات Android وإطار عمل المصادقة توفّر واجهة قياسية للتعامل مع بيانات اعتماد المستخدم مثل معلومات تسجيل الدخول.

حتى إذا كان تطبيقك لا يستخدم حسابات، سيظل عليك توفير مكوّن برنامج مصادقة. إذا كنت لا تستخدم الحسابات أو تسجيل الدخول إلى الخادم، سيتم التعامل مع المعلومات التي يعالجها برنامج المصادقة بحيث يمكنك توفير مكون مصادقة يحتوي على طريقة كعب وعمليات التنفيذ. وعليك أيضًا تقديم قيمة Service مرتبطة. يسمح لإطار عمل محول المزامنة باستدعاء طرق المصادقة.

يشرح هذا الدرس كيفية تعريف جميع أجزاء برنامج المصادقة عبر بروتوكول التوزُّع القصير تلبية متطلبات إطار عمل محوّلات المزامنة. إذا كنت بحاجة إلى تقديم وصف برنامج المصادقة الذي يتعامل مع حسابات المستخدمين، اطلع على المستندات المرجعية AbstractAccountAuthenticator

إضافة مكوِّن مصادقة كعب

لإضافة أحد مكوّنات المصادقة البديلة إلى تطبيقك، عليك إنشاء فئة تمتد AbstractAccountAuthenticator، ثم تخلّص من الطرق المطلوبة، إما من خلال عرض null أو طرح استثناء.

يعرض المقتطف التالي مثالاً على فئة مصادقة التشعّب:

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();
    }
}

ربط برنامج المصادقة بإطار العمل

لوصول إطار عمل محول المزامنة إلى تطبيق المصادقة، يجب إنشاء حد الخدمة المناسبة لذلك توفّر هذه الخدمة كائن ربط Android يتيح إنشاء إطار العمل. الاتصال بالمصادق وتمرير البيانات بين برنامج المصادقة وإطار العمل

يوضِّح لك المقتطف التالي كيفية تحديد قيمة 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();
    }
}

أضِف ملف البيانات الوصفية للمصادقة.

لتوصيل مكوّن المصادقة بمحوّل المزامنة وأُطر عمل الحساب، يجب وتوفر إطار العمل هذا ببيانات تعريف تصف المكون. توضح هذه البيانات الوصفية نوع الحساب الذي أنشأته لمحوّل المزامنة مع توضيح عناصر واجهة المستخدم التي يعرضها النظام إذا كنت تريد إظهار نوع حسابك للمستخدم. الإفصاح عن هذا المحتوى البيانات الوصفية في ملف XML مخزَّن في دليل /res/xml/ ضمن مشروع تطبيقك. يمكنك تسمية الملف، على الرغم من أنه يطلق عليه عادةً authenticator.xml.

يحتوي ملف XML هذا على عنصر واحد <account-authenticator> بالسمات التالية:

android:accountType
يتطلب إطار عمل محوّل المزامنة أن يكون لكل محوّل مزامنة نوع حساب، في النموذج لاسم المجال. ويستخدم إطار العمل نوع الحساب كجزء من محوّل المزامنة تحديد الهوية الداخلي. بالنسبة للخوادم التي تتطلب تسجيل الدخول، نوع الحساب مع يتم إرسال حساب المستخدم إلى الخادم كجزء من بيانات اعتماد تسجيل الدخول.

إذا كان الخادم الذي تستخدمه لا يتطلب تسجيل الدخول، عليك أيضًا تقديم نوع الحساب. بالنسبة إلى ، استخدم اسم مجال تتحكم فيه. وبينما يستخدمه إطار العمل لإدارة المزامنة، فلن يتم إرسال القيمة إلى الخادم.

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 اسم ملف البيانات الوصفية المصادق الذي قمت بإنشائه مسبقًا.

بالإضافة إلى برنامج مصادقة، يتطلب محوّل المزامنة أيضًا موفّر محتوى. وإذا لم تستخدم أحد موفّري المحتوى حاليًا، انتقِل إلى الدرس التالي لتعلّم كيفية إنشاء نص بديل. وإلا، فانتقل إلى الدرس إنشاء محوّل مزامنة.