Şablon kimlik doğrulayıcı oluşturma

Senkronizasyon bağdaştırıcısı çerçevesi, senkronizasyon bağdaştırıcınızın bir hesapla ilişkilendirilmiş cihaz depolama alanı ile giriş erişimi gerektiren sunucu depolama alanı arasında veri aktardığını varsayar. Bu nedenle çerçeve, senkronizasyon bağdaştırıcınızın parçası olarak kimlik doğrulayıcı adı verilen bir bileşen sağlamanızı bekler. Bu bileşen, Android hesaplarına ve kimlik doğrulama çerçevesine takılır ve giriş bilgileri gibi kullanıcı kimlik bilgilerinin işlenmesi için standart bir arayüz sağlar.

Uygulamanızda hesap kullanılmasa bile kimlik doğrulayıcı bileşeni sağlamanız gerekir. Hesapları veya sunucu girişini kullanmıyorsanız kimlik doğrulayıcının işlediği bilgiler yok sayılır. Böylece, saplama yöntemi uygulamalarını içeren bir kimlik doğrulayıcı bileşeni sağlayabilirsiniz. Ayrıca, senkronizasyon bağdaştırıcısı çerçevesinin kimlik doğrulayıcının yöntemlerini çağırmasına izin veren bağlı bir Service sağlamanız gerekir.

Bu derste, senkronizasyon bağdaştırıcısı çerçevesinin şartlarını karşılamak için ihtiyaç duyduğunuz tüm saplama kimlik doğrulayıcısı bölümlerini nasıl tanımlayacağınız gösterilmektedir. Kullanıcı hesaplarıyla ilgilenen gerçek bir kimlik doğrulayıcı sağlamanız gerekiyorsa AbstractAccountAuthenticator referans belgelerini okuyun.

Bir saplama kimlik doğrulayıcı bileşeni ekle

Uygulamanıza saplama kimlik doğrulayıcı bileşeni eklemek için AbstractAccountAuthenticator kapsamını genişleten bir sınıf oluşturun, ardından null kodunu döndürerek veya istisna oluşturarak gerekli yöntemleri inceleyin.

Aşağıdaki snippet'te bir saplama kimlik doğrulayıcı sınıfı örneği gösterilmektedir:

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

Kimlik doğrulayıcıyı çerçeveye bağlayın

Senkronizasyon bağdaştırıcısı çerçevesinin kimlik doğrulayıcınıza erişebilmesi için buna bağlı bir Hizmet oluşturmanız gerekir. Bu hizmet, çerçevenin kimlik doğrulayıcınızı çağırmasına ve kimlik doğrulayıcı ile çerçeve arasında veri iletmesine olanak tanıyan bir Android bağlayıcı nesnesi sağlar.

Aşağıdaki snippet'te Service sınırını nasıl tanımlayacağınız gösterilmektedir:

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

Kimlik doğrulayıcı meta veri dosyası ekle

Kimlik doğrulayıcı bileşeninizi senkronizasyon bağdaştırıcısına ve hesap çerçevelerine bağlamak için bu çerçeveye bileşeni açıklayan meta veriler sağlamanız gerekir. Bu meta veri, senkronizasyon bağdaştırıcınız için oluşturduğunuz hesap türünü ve hesap türünüzü kullanıcının görmesini istiyorsanız sistemin görüntülediği kullanıcı arayüzü öğelerini tanımlar. Bu meta veriyi, uygulama projenizdeki /res/xml/ dizininde depolanan bir XML dosyasında bildirin. Dosyaya istediğiniz adı verebilirsiniz ancak adı genellikle authenticator.xml olarak geçer.

Bu XML dosyası, aşağıdaki özelliklere sahip tek bir <account-authenticator> öğesi içerir:

android:accountType
Senkronizasyon bağdaştırıcısı çerçevesi, her senkronizasyon bağdaştırıcısının alan adı biçiminde bir hesap türüne sahip olmasını gerektirir. Çerçeve, hesap türünü senkronizasyon bağdaştırıcısının dahili tanımlamasının bir parçası olarak kullanır. Giriş gerektiren sunucular için hesap türü, kullanıcı hesabıyla birlikte giriş kimlik bilgilerinin bir parçası olarak sunucuya gönderilir.

Sunucunuz giriş gerektirmiyorsa, yine de bir hesap türü sağlamanız gerekir. Değer için kontrol ettiğiniz bir alan adını kullanın. Çerçeve, senkronizasyon bağdaştırıcınızı yönetmek için bunu kullanır ancak değer, sunucunuza gönderilmez.

android:icon
Simge içeren bir Drawable kaynağının üzerine gelin. res/xml/syncadapter.xml içinde android:userVisible="true" özelliğini belirterek senkronizasyon bağdaştırıcısını görünür hale getirirseniz bu simge kaynağını sağlamanız gerekir. Sistemin Ayarlar uygulamasının Hesaplar bölümünde görünür.
android:smallIcon
Simgenin küçük bir sürümünü içeren Drawable kaynağına işaret edin. Bu kaynak, ekran boyutuna bağlı olarak sistemin Ayarlar uygulamasının Hesaplar bölümündeki android:icon yerine kullanılabilir.
android:label
Hesap türünü kullanıcılara tanımlayan yerelleştirilebilir dize. res/xml/syncadapter.xml içinde android:userVisible="true" özelliğini belirterek senkronizasyon bağdaştırıcısını görünür hale getirirseniz bu dizeyi sağlamanız gerekir. Bu kimlik, sistemin Ayarlar uygulamasının Hesaplar bölümünde, kimlik doğrulayıcı için tanımladığınız simgenin yanında görünür.

Aşağıdaki snippet'te, daha önce oluşturduğunuz kimlik doğrulayıcının XML dosyası gösterilmektedir:

<?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"/>

Manifest'te kimlik doğrulayıcıyı bildirin

Önceki bir adımda, kimlik doğrulayıcıyı senkronizasyon bağdaştırıcısı çerçevesine bağlayan bir bağlı Service oluşturdunuz. Bu hizmeti sisteme tanımlamak için aşağıdaki <service> öğesini <application> alt öğesi olarak ekleyerek uygulama manifestinizde tanımlayın:

    <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> öğesi, kimlik doğrulayıcıyı çalıştırmak için sistem tarafından gönderilen android.accounts.AccountAuthenticator amaç işlemi tarafından tetiklenen bir filtre oluşturur. Filtre tetiklendiğinde sistem, kimlik doğrulayıcıyı sarmalamak için sağladığınız sınır Service olan AuthenticatorService işlemini başlatır.

<meta-data> öğesi, kimlik doğrulayıcının meta verilerini tanımlar. android:name özelliği, meta verileri kimlik doğrulama çerçevesine bağlar. android:resource öğesi, daha önce oluşturduğunuz kimlik doğrulayıcı meta veri dosyasının adını belirtir.

Senkronizasyon bağdaştırıcıları, kimlik doğrulayıcının yanı sıra içerik sağlayıcı da gerektirir. Uygulamanızda halihazırda bir içerik sağlayıcı kullanılmıyorsa sap içerik sağlayıcısının nasıl oluşturulacağını öğrenmek için sonraki derse, aksi takdirde Senkronizasyon Bağdaştırıcısı Oluşturma dersine geçin.