स्टब ऑथेंटिकेटर बनाएं

सिंक अडैप्टर फ़्रेमवर्क यह मानता है कि आपका सिंक अडैप्टर, एक डिवाइस के स्टोरेज के बीच डेटा ट्रांसफ़र करता है जो खाते और सर्वर स्टोरेज से जुड़ा होता है. इसके लिए, लॉगिन करने की ज़रूरत होती है. इस वजह से, फ़्रेमवर्क चाहता है कि आप सिंक करने के हिस्से के तौर पर, पुष्टि करने वाला कॉम्पोनेंट उपलब्ध कराएं अडैप्टर. यह कॉम्पोनेंट, 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();
    }
}

पुष्टि करने वाले को फ़्रेमवर्क से बाइंड करें

सिंक अडैप्टर फ़्रेमवर्क आपके Authenticator को ऐक्सेस कर सके, इसके लिए आपको एक बाउंड बनाना होगा इसके लिए सेवा. यह सेवा एक ऐसा 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();
    }
}

पुष्टि करने वाले की मेटाडेटा फ़ाइल जोड़ें

पुष्टि करने वाले कॉम्पोनेंट को सिंक अडैप्टर और खाते के फ़्रेमवर्क में प्लग करने के लिए, आपको इन फ़्रेमवर्क को ऐसे मेटाडेटा के साथ उपलब्ध कराएं जिसमें कॉम्पोनेंट की जानकारी दी गई हो. यह मेटाडेटा बताता है कि वह खाता टाइप जिसे आपने सिंक अडैप्टर के लिए बनाया है. साथ ही, इसमें यूज़र इंटरफ़ेस के एलिमेंट के बारे में बताया गया है जिसे सिस्टम तब दिखाता है, जब आपको उपयोगकर्ता को अपना खाता टाइप दिखाना है. इसका एलान करें आपके ऐप्लिकेशन प्रोजेक्ट की /res/xml/ डायरेक्ट्री में स्टोर की गई एक्सएमएल फ़ाइल में मौजूद मेटाडेटा. फ़ाइल को कोई भी नाम दिया जा सकता है. हालांकि, आम तौर पर इसे authenticator.xml कहा जाता है.

इस एक्सएमएल फ़ाइल में एक ऐसा एलिमेंट <account-authenticator> है जो के ये एट्रिब्यूट हैं:

android:accountType
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है सिंक अडैप्टर फ़्रेमवर्क के मुताबिक, हर सिंक अडैप्टर में खाता टाइप होना चाहिए. यह फ़ॉर्मैट एक डोमेन नाम डालें. फ़्रेमवर्क, खाते के टाइप का इस्तेमाल सिंक अडैप्टर के हिस्से के तौर पर करता है करने में मदद मिलती है. जिन सर्वर के लिए लॉगिन करना ज़रूरी होता है उनके लिए, खाता टाइप के साथ उपयोगकर्ता खाता, लॉगिन क्रेडेंशियल के हिस्से के तौर पर सर्वर को भेजा जाता है.

अगर आपके सर्वर में लॉगिन करने की ज़रूरत नहीं है, तब भी आपको खाता टाइप बताना होगा. मान, उस डोमेन नाम का उपयोग करें जिसे आप नियंत्रित करते हैं. फ़्रेमवर्क इसका इस्तेमाल आपकी साइट की सिंक अडैप्टर नहीं है, तो मान आपके सर्वर पर नहीं भेजा जाता है.

android:icon
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ड्रॉ करने लायक की ओर पॉइंटर संसाधन में आइकॉन शामिल है. यदि आप res/xml/syncadapter.xml में android:userVisible="true" एट्रिब्यूट, तो आपको यह आइकन संसाधन उपलब्ध कराना होगा. यह इसके खाता सेक्शन में दिखता है सेटिंग ऐप्लिकेशन पर जाकर अपडेट कर सकते हैं.
android:smallIcon
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है ड्रॉ करने लायक की ओर पॉइंटर जिसमें आइकॉन का छोटा वर्शन शामिल हो. इसके बजाय इस संसाधन का उपयोग किया जा सकता है सिस्टम के सेटिंग ऐप्लिकेशन के खाते सेक्शन में android:icon पर, .
android:label
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है स्थानीय जगह के अनुसार बनाई जा सकने वाली स्ट्रिंग, जो उपयोगकर्ताओं को खाता टाइप की पहचान करती है. अगर सिंक अडैप्टर बनाया जाता है, तो में android:userVisible="true" विशेषता तय करके दृश्यमान res/xml/syncadapter.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> अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एलिमेंट एक ऐसा फ़िल्टर सेट अप करता है जो इंटेंट कार्रवाई से ट्रिगर होता है android.accounts.AccountAuthenticator, जिसे सिस्टम की ओर से भेजा जाता है, ताकि पुष्टि करने वाला. फ़िल्टर के ट्रिगर होने पर, सिस्टम AuthenticatorService शुरू करता है, पुष्टि करने वाले को रैप करने के लिए, आपने जो बाउंड Service दिया है वह तय करता है.

कॉन्टेंट बनाने <meta-data> अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एलिमेंट, पुष्टि करने वाले के लिए मेटाडेटा के बारे में बताता है. कॉन्टेंट बनाने android:name अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एट्रिब्यूट, मेटा-डेटा को पुष्टि करने के फ़्रेमवर्क से जोड़ता है. कॉन्टेंट बनाने android:resource अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एलिमेंट, पुष्टि करने वाली उस मेटाडेटा फ़ाइल का नाम बताता है जिसे आपने पहले बनाया था.

पुष्टि करने वाले के अलावा, सिंक अडैप्टर के लिए कॉन्टेंट उपलब्ध कराने वाले की भी ज़रूरत होती है. अगर आपका ऐप्लिकेशन यह नहीं करता है पहले से ही कॉन्टेंट प्रोवाइडर का इस्तेमाल कर रहे हैं, तो स्टब कॉन्टेंट बनाने का तरीका जानने के लिए अगले लेसन पर जाएं कंपनी; अगर ऐसा नहीं है, तो सिंक अडैप्टर बनाना लेख देखें.