경고: 이 문서는 지원 중단되었습니다. OAuth 2.0을 사용하여 Android 앱을 승인하는 방법에 대한 자세한 내용은 Android Play 서비스 승인 문서
이 문서에서는 Android에서 OAuth 2.0으로 Tasks API를 사용하는 방법을 설명합니다. 또한 사용자의 Google Tasks에 액세스하기 위한 승인 메커니즘과 Android 애플리케이션에서 Tasks API 서비스 객체를 즉시 사용할 수 있도록 준비하는 방법을 설명합니다.
Android 애플리케이션에서 Tasks API를 사용하려면 여러 단계를 거쳐야 합니다. 다음을 실행해야 합니다.
- 사용자의 Google 계정 선택
- Task API의 AccountManager에서 OAuth 2.0 액세스 토큰 가져오기
- 프로젝트 식별 및 Tasks 서비스 객체 설정
- Tasks API 호출
Google의 클라이언트 라이브러리 가져오기
이 문서에서 찾을 수 있는 샘플은 Java용 Google API 클라이언트 라이브러리를 사용합니다. Android 애플리케이션에 다음 jar을 추가해야 합니다. 이렇게 하려면 아래에 나열된 jar을 Android 애플리케이션 루트의 /assets 폴더에 배치합니다. 또한 문서가 오래될수록 새 버전이 있는지 확인하시기 바랍니다.
Google API 클라이언트 라이브러리 jar 및 Android 확장 프로그램 (모두 google-api-java-client-1.4.1-beta.zip의 일부)을 가져옵니다.
- google-api-client-1.4.1-beta.jar
- google-api-client-extensions-android2-1.4.1-beta.jar
- google-api-client-googleapis-1.4.1-beta.jar
- google-api-client-googleapis-extensions-android2-1.4.1-beta.jar
Tasks 관련 jar을 가져옵니다.
종속 항목 (모두 google-api-java-client-1.4.1-beta.zip의 일부)을 가져옵니다.
- commons-codec-1.3.jar
- gson-1.6.jar
- guava-r09.jar
- httpclient-4.0.3.jar
- httpcore-4.0.1.jar
- jackson-core-asl-1.6.7.jar
- jsr305-1.3.9.jar
Android의 Google 계정
Android 2.0부터는 AccountManager가 개발자 환경에 등록한 계정을 관리합니다. 계정은 Settings > > 계정 및 동기화를 선택합니다. 특히 승인 흐름을 처리하고 API를 사용하여 데이터에 액세스하는 데 필요한 승인 토큰을 생성할 수 있습니다.
AccountManager를 사용하여 계정을 가져오고 승인 토큰을 요청할 수 있으려면 Android 애플리케이션 매니페스트에 다음 권한을 추가해야 합니다.
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" />
AccountManager를 사용하여 Tasks에 액세스할 Google 계정을 가져올 수 있습니다. AccountManager는 Google 계정뿐만 아니라 다른 공급업체의 계정도 관리합니다. 따라서 아래 코드를 사용하여 Google 계정을 구체적으로 요청해야 합니다.
AccountManager accountManager = AccountManager.get(activity); Account[] accounts = accountManager.getAccountsByType("com.google");
또는 Java용 Google API 클라이언트 라이브러리에는 Google 계정만 처리하는 GoogleAccountManager가 함께 제공됩니다.
GoogleAccountManager googleAccountManager = new GoogleAccountManager(activity); Account[] accounts = googleAccountManager.getAccounts();
Android 기기에서 Google 계정을 두 개 이상 사용할 수 있는 경우 사용자에게 다음과 같은 대화상자와 함께 사용하려는 계정을 묻는 메시지를 표시해야 합니다.
활동의 onCreateDialog 메서드에서 다음과 같은 switch/case 코드를 사용하여 이러한 대화상자를 빌드할 수 있습니다.
@Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_ACCOUNTS: AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select a Google account"); final Account[] accounts = accountManager.getAccountsByType("com.google"); final int size = accounts.length; String[] names = new String[[]size]; for (int i = 0; i < size; i++) { names[[]i] = accounts[[]i].name; } builder.setItems(names, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Stuff to do when the account is selected by the user gotAccount(accounts[[]which]); } }); return builder.create(); } return null; }
showDialog(DIALOG_ACCOUNTS)를 호출하면 계정 선택기 대화상자가 표시됩니다.
Android의 Google API 승인 흐름
이제 사용자가 계정을 선택했으므로 AccountManager에게 Task API용 OAuth 2.0 액세스 토큰을 발급하도록 요청할 수 있습니다. 이 작업은 AccountManager.getAuthToken() 메서드를 호출하여 이루어집니다. AccountManager.getAuthToken()을 호출하는 동안 AccountManager가 Google API 승인 엔드포인트에 대한 연결을 처리합니다. AccountManager가 인증 토큰을 가져오면 메서드 호출에서 정의한 AccountManagerCallback이 실행됩니다.
manager.getAuthToken(account, AUTH_TOKEN_TYPE, null, activity, new AccountManagerCallback<Bundle>() { public void run(AccountManagerFuture<Bundle> future) { try { // If the user has authorized your application to use the tasks API // a token is available. String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN); // Now you can use the Tasks API... useTasksAPI(token); } catch (OperationCanceledException e) { // TODO: The user has denied you access to the API, you should handle that } catch (Exception e) { handleException(e); } } }, null);
이미 알고 계시겠지만 Android AccountManager는 OAuth 2.0을 실험적으로 지원합니다. AUTH_TOKEN_TYPE을 설정할 때 액세스하려는 API의 범위에 oauth2:를 접두사로 추가하기만 하면 됩니다. 따라서 Tasks API의 경우 다음을 사용할 수 있습니다.
String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";
위의 값을 AUTH_TOKEN_TYPE으로 사용할 때 문제는 액세스하려는 Google 제품의 이름으로 oauth2:https://www.googleapis.com/auth/tasks 문자열이 승인 대화상자에 표시된다는 점입니다. 이 문제를 해결하기 위해 사람이 읽을 수 있는 특수 AUTH_TOKEN_TYPE 별칭이 Tasks API에 존재합니다. OAuth 2.0 범위를 사용하는 것과 같습니다. 예를 들어 다음을 사용할 수 있습니다.
String AUTH_TOKEN_TYPE = "Manage your tasks";
AUTH_TOKEN_TYPE 별칭을 사용할 수도 있습니다. 작업 보기: Tasks API 읽기 전용과 동등합니다. 범위: oauth2:https://www.googleapis.com/auth/tasks.readonly.
AccountManager.getAuthToken()을 호출하는 동안 AccountManager는 애플리케이션이 Tasks API에 액세스하도록 승인되었는지 확인합니다. 애플리케이션이 아직 승인되지 않은 경우 AccountManager가 Activity를 시작하여, 사용자에게 승인 대화상자를 표시하여, 사용자가 자신의 계정에서 애플리케이션의 Tasks API 사용을 허용 또는 거부할 수 있습니다.
사용자가 Tasks API에 대한 애플리케이션 액세스를 거부하면 future.getResult() 호출 중에 OperationCanceledException이 발생합니다. 예를 들어 계정을 다시 선택하도록 요청하거나 액세스 권한을 다시 부여하는 버튼이 있는 메시지를 표시하여 이를 적절하게 처리해야 합니다.
애플리케이션 식별 및 Tasks API 서비스 객체 설정
이제 애플리케이션에 Tasks API에 액세스할 수 있는 권한이 있고 액세스 토큰이 제공되었으므로 Tasks API를 호출하는 데 필수적이므로 Google API 콘솔의 프로젝트에서 가져와야 하는 API 키도 필요합니다. 방법은 다음과 같습니다.
- 프로젝트 만들기 또는 기존 프로젝트 사용
- Tasks API 스위치를 사용으로 전환하여 프로젝트에서 Tasks API를 사용 설정합니다.
- API 키는 API 액세스 > 간단한 API 액세스 > API 키
API 키는 애플리케이션을 식별하므로 API가 할당량을 공제하고 프로젝트에 정의된 할당량 규칙을 사용할 수 있으므로 필수입니다. Tasks 서비스 객체에서 API 키를 지정해야 합니다.
useTasksAPI(String accessToken) { // Setting up the Tasks API Service HttpTransport transport = AndroidHttp.newCompatibleTransport(); AccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken); Tasks service = new Tasks(transport, accessProtectedResource, new JacksonFactory()); service.accessKey = INSERT_YOUR_API_KEY; service.setApplicationName("Google-TasksSample/1.0"); // TODO: now use the service to query the Tasks API }
accessToken은 특정 시간 동안만 유효하므로 만료되면 새로 만들어야 합니다. 다음 두 가지 방법으로 처리할 수 있습니다.
- API를 통해 요청할 때마다 AccountManager에 accessToken을 요청합니다. AccountManager가 토큰을 캐시하므로 이 방법이 허용됩니다.
- AccountManager에 새 토큰을 요청하는 403 오류가 발생할 때까지 accessToken을 계속 사용합니다.
API를 통한 태스크 조작
이제 Tasks API 개발자 가이드에 따라 API를 쿼리하는 데 사용할 수 있는 Tasks API service 객체가 완전히 설정되어 있어야 합니다. 예를 들면 다음과 같습니다.
// Getting all the Task lists ListtaskLists = service.tasklists.list().execute().items; // Getting the list of tasks in the default task list List tasks = service.tasks.list("@default").execute().items; // Add a task to the default task list Task task = new Task(); task.title = "New Task"; task.notes = "Please complete me"; task.due = "2010-10-15T12:00:00.000Z"; Task result = service.tasks.insert("@default", task).execute();
Android 애플리케이션 매니페스트에 인터넷 액세스 권한을 추가해야 합니다. 추가하지 않으면 Tasks API 엔드포인트에 대한 위의 요청이 실패합니다.
<uses-permission android:name="android.permission.INTERNET" />
샘플 애플리케이션
Android에서 Tasks API 및 OAuth 2.0을 시작하는 데 도움이 되도록 Google은 최근 Java용 Google API 클라이언트 라이브러리 샘플 저장소에 새 샘플을 추가했습니다. 샘플은 간단하지만 완벽하게 작동하는 Android 애플리케이션으로, Tasks API를 사용하기 위한 승인을 요청하고 기본 작업 목록의 작업을 ListView에 표시합니다.
샘플을 실행하려면 다음 안내를 따르고, 의견이나 질문이 있으면 언제든지 Google Tasks API 포럼에 게시하세요.