동기화 어댑터 프레임워크는 동기화 어댑터가 기기 저장소 간에 데이터를 전송한다고 가정합니다. 계정 및 서버 저장공간에 연결되어 있어야 합니다. 따라서 프레임워크는 동기화의 일부로 인증자라는 구성 요소를 제공할 것으로 예상합니다. 어댑터에 연결합니다. 이 구성 요소는 Android 계정 및 인증 프레임워크에 연결하고 는 로그인 정보와 같은 사용자 자격 증명을 처리하기 위한 표준 인터페이스를 제공합니다.
앱에서 계정을 사용하지 않더라도 인증자 구성요소를 제공해야 합니다.
계정 또는 서버 로그인을 사용하지 않는 경우 인증자가 처리하는 정보는 다음과 같습니다.
무시되므로 스텁 메서드가 포함된 인증자 구성요소를 제공할 수 있습니다.
있습니다. 또한 바인드된 Service
도 제공해야 합니다.
동기화 어댑터 프레임워크가 인증자의 메서드를 호출할 수 있게 합니다.
이 강의에서는 스텁 인증자에서 인증을 완료해야 하는 모든 부분을 정의하는 방법을 보여줍니다.
동기화 어댑터 프레임워크의 요구사항을 충족해야 합니다. 실제 URL을 제공해야 하는 경우
인증 기관에 대해 자세히 알아보려면
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() } }
자바
/* * 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 }
자바
/** * 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/
디렉터리에 저장된 XML 파일의 메타데이터입니다.
파일 이름은 일반적으로 authenticator.xml
이지만 원하는 이름을 지정할 수 있습니다.
이 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 파일을 보여줍니다.
<?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
요소는 이전에 만든 인증자 메타데이터 파일의 이름을 지정합니다.
동기화 어댑터에는 인증자 외에 콘텐츠 제공업체도 필요합니다. 앱이 작동하지 않는 경우 이미 사용 중인 경우 다음 강의로 이동하여 스텁 콘텐츠를 만드는 방법을 알아보세요. provider; 그렇지 않으면 동기화 어댑터 만들기 강의로 이동하세요.