Ş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, cihaz depolama alanı arasında veri aktardığını varsayar giriş erişimi gerektiren bir hesapla ve sunucu depolama alanıyla ilişkilendirilmiş. Bu nedenle, çerçeve, senkronizasyonun parçası olarak kimlik doğrulayıcı adı verilen bir bileşen sağlamanızı bekler adaptörü kullanabilirsiniz. Bu bileşen, Android hesapları ile kimlik doğrulama çerçevesine bağlanır ve giriş bilgileri gibi kullanıcı kimlik bilgilerinin işlenmesi için standart bir arayüz sağlar.

Uygulamanız hesap kullanmasa bile yine de bir kimlik doğrulayıcı bileşeni sağlamanız gerekir. Hesapları veya sunucuya giriş bilgilerini kullanmıyorsanız kimlik doğrulayıcısı tarafından işlenen bilgiler yoksayıldığından saplama yöntemi içeren bir kimlik doğrulayıcı bileşen sağlayabilirsiniz. hakkında bilgi edindiniz. Ayrıca, şu koşulları karşılayan bağlı Service sağlamanız gerekir: senkronizasyon bağdaştırıcısı çerçevesinin kimlik doğrulayıcının yöntemlerini çağırmasına olanak tanır.

Bu derste, giriş yapmanız için bir saplama kimlik doğrulayıcısının tüm bölümlerini nasıl senkronizasyon bağdaştırıcısı çerçevesinin gereksinimlerini karşılamalıdır. Gerçek bir değer sağlamanız gerekiyorsa hakkında daha fazla bilgi edinmek istiyorsanız aşağıdaki başvuru kaynakları için AbstractAccountAuthenticator

Saplama kimlik doğrulayıcı bileşeni ekleyin

Uygulamanıza, kök kimlik doğrulayıcı bileşeni eklemek için AbstractAccountAuthenticator ve gerekli yöntemleri çıkardıktan sonra, null değerini döndürerek veya bir istisna yaparak.

Aşağıdaki snippet'te stub kimlik doğrulayıcı sınıfının bir ö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şmesi için bağlı bir bağlantı oluşturmanız gerekir Hizmet. Bu hizmet, çerçeveye izin veren bir Android bağlayıcı nesnesi sağlar kimlik doğrulayıcınızı çağırıp kimlik doğrulayıcı ile çerçeve arasında veri aktarın.

Aşağıdaki snippet, bağlı Service öğesini nasıl tanımlayacağınızı gösterir:

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ını ekleyin

Kimlik doğrulayıcı bileşeninizi senkronizasyon bağdaştırıcısı ve hesap çerçevelerine takmak için bu çerçeveye bileşeni açıklayan meta veriler sağlar. Bu meta veri senkronizasyon bağdaştırıcınız için oluşturduğunuz hesap türü ve kullanıcı arayüzü öğelerini tanımlar hesap türünüzü görünür hale getirmek istiyorsanız sistem tarafından görüntülenir. Bunu beyan et meta verileri, uygulama projenizdeki /res/xml/ dizininde depolanır. Genellikle authenticator.xml olarak adlandırılsa da dosyaya istediğiniz adı verebilirsiniz.

Bu XML dosyası şunları içeren tek bir öğe <account-authenticator> içeriyor: şu özelliklere sahiptir:

android:accountType
. Senkronizasyon bağdaştırıcısı çerçevesi, her senkronizasyon bağdaştırıcısının aşağıdaki biçimde bir hesap türüne sahip olmasını gerektirir: bir açıklaması olabilir. Çerçeve, hesap türünü senkronizasyon bağdaştırıcısının dahili tanımlama. Giriş gerektiren sunucular için hesap türü ve kullanıcı hesabı, sunucuya giriş kimlik bilgilerinin bir parçası olarak gönderilir.

Sunucunuz giriş gerektirmiyorsa yine de bir hesap türü sağlamanız gerekir. sizin kontrolünüzdeki bir alan adını kullanın. Çerçeve, dönüşümünüzü yönetmek için senkronizasyon bağdaştırıcısı kullanıyorsanız değer sunucunuza gönderilmez.

android:icon
. İşaretçiyi bir çekilebilir öğe üzerine getirin bir simge içeren bir kaynak olduğunu varsayalım. Senkronizasyon bağdaştırıcısını res/xml/syncadapter.xml içindeki android:userVisible="true" özelliği, bu simge kaynağını sağlamalısınız. Hesabınızın Hesaplar bölümünde sistemin Ayarlar uygulamasına
android:smallIcon
. İşaretçiyi bir çekilebilir öğe üzerine getirin simgenin küçük bir sürümünü içeren kaynak. Bu kaynak, android:icon: Sistemin Ayarlar uygulamasının Hesaplar bölümünde ekran boyutuna göre değişir.
android:label
. Hesap türünü kullanıcılara tanımlayan yerelleştirilebilir dize. Senkronizasyon bağdaştırıcısını android:userVisible="true" özelliği belirtilerek görülebilir. res/xml/syncadapter.xml ise bu dizeyi sağlamanız gerekir. Bu Hesaplar bölümünde, kimlik doğrulayıcı.

Aşağıdaki snippet, daha önce oluşturduğunuz kimlik doğrulayıcıya ilişkin XML dosyasını gösterir:

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

Kimlik doğrulayıcıyı manifest dosyasında bildir

Önceki adımda, kimlik doğrulayıcıyı bağlayan bir bağlı Service oluşturdunuz bağlantı kurmalısınız. Bu hizmeti sisteme tanımlamak için uygulamanızda beyan edin aşağıdakini ekleyerek manifest dosyanızı <service>. öğesini, <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>

İlgili içeriği oluşturmak için kullanılan <intent-filter>. öğesi, intent işlemi tarafından tetiklenen bir filtre oluşturur. çalıştırmak için sistem tarafından gönderilen android.accounts.AccountAuthenticator kimlik doğrulayıcı. Filtre tetiklendiğinde sistem, AuthenticatorService filtresini başlatır. kimlik doğrulayıcıyı sarmalamak için sağladığınız sınır Service.

İlgili içeriği oluşturmak için kullanılan <meta-data>. öğesi kimlik doğrulayıcının meta verilerini tanımlar. İlgili içeriği oluşturmak için kullanılan android:name. özelliği, meta verileri kimlik doğrulama çerçevesine bağlar. İlgili içeriği oluşturmak için kullanılan 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ısı, kimlik doğrulayıcının yanı sıra içerik sağlayıcıya da ihtiyaç duyar. Uygulamanız yoksa halihazırda bir içerik sağlayıcı kullanıyorsanız "sabit içerik" oluşturmayı öğrenmek için bir sonraki derse gidin. sağlayıcı; Aksi takdirde Senkronizasyon Bağdaştırıcısı Oluşturma dersine gidin.