2011-03-14 2 views
8

내 응용 프로그램에 안드로이드의 계정 관리를 통합했으며 Accounts & Sync 설정에서 계정을 관리 할 수 ​​있습니다.로그인 처리 및 AccountManager로 기억하기

성공적인 로그인시 사용자의 홈 활동으로 사용자를 전달하는 고전적인 로그인 활동을 원합니다. 사용자의 비밀번호를 기억하는 옵션이 있습니다. 그러나 AccountAuthenticatorActivity은 해당 결과를 AccountManager에 자격 증명과 나머지 계정 정보로 반환해야하며 명시 적으로 finish()을 호출하고 인 텐트를 반환해야합니다.

AccountManager에게 내 로그인 활동이 적용되지 않아도 필요한 정보를 어떻게 제공 할 수 있습니까?

+0

그래서 마침내 로그인을 처리하고 AccountManager를 통해 나를 기억하나요? 나는 그것 때문에 애플 리케이션 흐름에 고심하고있다. 장치에 계정이없는 경우에만 내 앱을 시작할 때 AccountAuthenticatorActivity를 트리거하려고하지만 올바르게 작동하도록 "최상의 방법"흐름을 얻지 못합니다. – CinetiK

답변

19

AccountManager는 대화 형 응용 프로그램이 아닌 동기화 어댑터에서 호출 할 수 있습니다. 그것은이 같다. (좋은 튜토리얼이 좋은 코드 예제를 제공하지만 데이터의 흐름을 설명하는 등 큰 일을하지 않는 Part 1Part 2? "그러나»안드로이드 동기화 공급자를 쓰는 것은 당신이 승리 했") :

당신은 데이터베이스를 감싸는 ContentProvider를 개발합니다. 서버에 연결하고 데이터를 가져오고 ContentProvider를 동기화하여 서버와 일치시키는 SyncAdapter (백그라운드 서비스)를 빌드합니다. 그런 다음 ContentProvider에 쿼리하여 가져온 데이터를 표시합니다. 결과를 검색하고 캐시하려는 경우 특정 정보를 직접 쿼리하는 몇 가지 방법이 있습니다. 데이터 모델이 어떻게 나타나야하는지에 대한 좋은 1 시간 세션은 Developing RESTful Android Apps을 참조하십시오. 이들은 "순진한"구현에서 시작하여 적절한 SyncAdapter 모델로 진행하는 세 가지 아키텍처 예제를 제공합니다.

인증 자체에 대해 SyncAdapter가 AccountManager를 사용하는 방법은 인증 토큰을 얻는 것입니다. 이것은 대개 16 진수 값으로, 사용자 이름/비밀번호 쌍 대신 HTML 헤더의 일부로 전달됩니다. 한 세션 고유 키로 생각하십시오. 키의 소유권은 인증의 증거이며 주기적으로 만료됩니다. 만료되면 다시 인증하고 새 인증서를 가져옵니다. SyncAdapater는 AccountManager에 특정 계정 유형/사용자 이름 조합에 대한 인증 토큰을 요청합니다. AccountManager는 서버와 인증을하고 (변경 사항으로 인해 사용자에게 필요한 경우 새 암호를 묻습니다) 토큰을 SyncAdapter로 리턴합니다.

이 모델이 애플리케이션에 적합하지 않은 경우 앱 코드에서 수동으로 로그인/로그 아웃을 처리해야합니다. 고통의 종류, 알아.

+0

현재 콘텐츠 공급자가 db를 래핑하고 동기화 어댑터 (google IO talk rocks!)를 사용하여 언급 한 설정이 있습니다. 나는 AccountAuthenticatorActivity를 재사용하여 일반 로그인을 처리하려고합니다. "당신은 아직 이겼습니까?"튜토리얼은 AccountManager 상호 작용을 기존 로그인 화면에 추가합니다 (완전한 코드를 표시하지는 않지만). 그래서 동일한 활동을 사용하기위한 해결 방법이있을 것입니다. – mgv

+0

좋습니다. 따라서 예제 코드는 로그인 화면을 표시하지만 다른 계정 (Google 계정, Facebook 계정 등)과 마찬가지로 화면은 계정 및 동기화 제어판에서 표시되며 앱에서는 표시되지 않습니다. (Android gMail 앱에 비밀번호를 입력 할 수있는 장소를 찾으십시오. 계정 및 동기화를 통해서만 가능합니다. 따라서 여기 모델은 A & S 제어 페이지에 비밀번호를 입력하면 앱이 AccountAuthenticator에게 서버에 들어가는 방법을 묻습니다. Authenticator는 SyncAdapater에 authToken을 제공하고 SyncAdapter는 인증 할 서버에 authToken을 제공합니다. – jcwenger

+0

음, 더 정확하게 말하면 계정을 추가 할 수 있지만 AccountAuthenticator에서 직접 호출하지 않고 Accounts & Sync "Create Account"활동을 시작하기위한 의도를 호출하면됩니다. 그리고 계정이 생성되면 귀하의 경우처럼 SyncAdapter가 더러운 작업을 수행하기를 기다리고 있습니다. – jcwenger

11

@jcwenger 완전히 정확하지 않습니다. 대화 형 응용 프로그램에서도 AccountManager을 사용할 수 있습니다. 예를 들어 AccountManageraddAccountExplicitly() 메소드를 사용하여 계정 관리자 인터페이스를 호출하지 않고 계정을 추가 할 수 있습니다.

"당신은 아직 우승 했습니까?" 계정 관리자가 애플리케이션 자신의 Activity에서 호출되었음을 알 수 있습니다. 응용 프로그램에 자체 계정 관리 인터페이스가있는 경우 유용합니다. 같은 관리자를 사용하여 '고전적인 흐름'의

1

내 버전 :

내가 그것을 통해 사용되는 일반적인 경우 모두 내 AuthenticatorActivity를 사용합니다. 계정 & 동기화 설정이지만 같은 계정을 사용하는 응용 프로그램에서 사용할 수 있도록 열어 놓았습니다. Authenticator가 구현 된 별도의 apk와이 계정을 사용하는 다른 앱 (별도 apk)이 있습니다.

케이스 처리 :

  • 정상적인 경우 : 사용자/비아를 인증 추가한다. 계정 & 동기화 (Android 샘플 프로젝트 별)

  • 외부 앱의 인증 요청 처리 : 어떻게? Authenticator 응용 프로그램의 Manifest에 인 텐트 필터를 제공하여 다른 응용 프로그램이 AuthenticatorActivity를 통해 인스턴스를 생성 할 수 있도록합니다. startActivityForResult (앱의 패키지인지 여부를 나타내는 추가 의도 정보를 포함해야 함). AuthenticatorActivity에서이 경우를 감지하고 위의 정상적인 경우에 사용하기 때문에 인증 프로세스가 끝났을 때 setAccountAuthenticatorResult를 호출하지 않습니다. 사용자가 자격 증명을 입력하고 로그인을 누릅니다. AccountManger에서 일치하는 계정이 있는지 확인하고 일치하는 경우 I 은 해당 계정의 사용자 이름을 통화중인 응용 프로그램 패키지의 활성 사용자로 유지합니다. 그런 다음 호출 앱에 인 텐트를 반환합니다. 성공을 나타내는 setResult, 사용자 이름 및 계정 유형. 계정이 존재하지 않는 경우에는 정상적인 경우가 진행되는 과정, 즉 addAccountExplicitly를 호출 한 다음 활성 사용자를 설정 한 다음 setResult를 호출하고 완료하는 과정을 거칩니다.

희망이 있으면 도움이 될 것입니다.