Uyarı: Bu doküman kullanımdan kaldırıldı. Android uygulamalarını OAuth 2.0 kullanarak yetkilendirme hakkında bilgi edinmek için lütfen Android Play Hizmetleri Yetkilendirme belgelerine göz atın.
Bu dokümanda, Görevler API'sinin Android'de OAuth 2.0 ile nasıl kullanılacağı açıklanmaktadır. Burada, bir kullanıcının Google Görevler’ine erişmek için gereken yetkilendirme mekanizmaları ve Android uygulamanızda Görevler API hizmeti Nesnesi’ni kullanmaya nasıl hazır olabileceğiniz açıklanmaktadır.
Android uygulamanızın Görevler API'sını kullanabilmesi için birkaç adım gereklidir:
- Kullanıcının Google Hesabını seçin
- AccountManager'dan Task API için OAuth 2.0 erişim jetonu alma
- Projenizi tanımlayın ve Görevler hizmet Nesnesi'ni ayarlayın
- Görevler API'sine çağrı yapma
Google'ın istemci kitaplığını içe aktarma
Bu dokümanda bulacağınız örneklerde Java için Google API'leri istemci kitaplığı kullanılmaktadır. Aşağıdaki jar'ları Android uygulamanıza eklemeniz gerekir. Bunun için aşağıda listelenen jar'ları Android uygulamanızın kök dizinindeki /assets klasörüne yerleştirin. Ayrıca, bu doküman eskidikçe yeni sürümleri de kontrol edin.
Google API'leri istemci kitaplığı jar dosyalarını ve Android uzantılarını (google-api-java-client-1.4.1-beta.zip dosyasının tamamı) içe aktarın:
- 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
Görevler'e özgü jar dosyasını içe aktarın:
Bağımlılıkları içe aktarma (google-api-java-client-1.4.1-beta.zip klasörünün tamamı):
- 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'deki Google Hesapları
Android 2.0 sürümünden itibaren AccountManager, ortamınıza kaydettiğiniz hesapları, Ayarlar > Hesaplar ve senkronizasyon bölümünde listelenen hesapları yönetir. Özellikle yetkilendirme akışını yönetir ve API'leri kullanarak verilere erişmek için gereken yetkilendirme jetonlarını oluşturabilir.
Hesapları almak ve yetkilendirme jetonları istemek amacıyla AccountManager'ı kullanabilmek üzere Android uygulama manifestinize aşağıdaki izinleri eklemeniz gerekir:
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" />
Görevler'e erişmek istediğiniz Google hesabını almak için AccountManager'ı kullanabilirsiniz. AccountManager yalnızca Google hesaplarını değil, diğer tedarikçi firmaların hesaplarını da yönetir. Dolayısıyla, aşağıdaki kodu kullanarak özel olarak Google hesaplarını istemeniz gerekir:
AccountManager accountManager = AccountManager.get(activity); Account[] accounts = accountManager.getAccountsByType("com.google");
Alternatif olarak, Java için Google API'leri istemci kitaplığı yalnızca Google hesaplarını işleyen bir GoogleAccountManager ile birlikte gelir:
GoogleAccountManager googleAccountManager = new GoogleAccountManager(activity); Account[] accounts = googleAccountManager.getAccounts();
Android cihazda birden fazla Google Hesabı varsa kullanıcıdan, kullanmak istediği hesabı aşağıdaki gibi bir iletişim kutusuyla belirtmeniz gerekir:
Etkinliğinizin onCreateDialog yönteminde aşağıdaki Switch/case kodunu kullanarak böyle bir iletişim kutusu oluşturabilirsiniz:
@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) çağrılırsa hesap seçici iletişim kutusu görüntülenir.
Android'de Google API'leri yetkilendirme akışı
Kullanıcı bir hesap seçtiğine göre artık AccountManager'dan Görev API'sı için bir OAuth 2.0 erişim jetonu vermesini isteyebiliriz. Bu, AccountManager.getAuthToken() yöntemi çağrılarak yapılır. AccountManager.getAuthToken() çağrısı sırasında AccountManager, Google API'leri yetkilendirme uç noktasıyla iletişime geçme işlemini gerçekleştirir. AccountManager yetkilendirme jetonunu aldığında, yöntem çağrısında tanımladığınız AccountManagerCallback'i çalıştırır:
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);
Sizin de bildiğiniz gibi Android AccountManager, OAuth 2.0 için deneysel desteğe sahiptir. AUTH_TOKEN_TYPE değerini ayarlarken erişmek istediğiniz API'nin kapsamının önüne oauth2: eklemeniz yeterlidir. Görevler API'sı için şunları kullanabilirsiniz:
String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";
Yukarıdaki değer AUTH_TOKEN_TYPE olarak kullanılırken sorun, oauth2:https://www.googleapis.com/auth/tasks dizesinin, yetkilendirme iletişim kutusunda erişmek istediğiniz Google ürününün adı olarak görüntülenmesidir. Bu sorunu gidermek amacıyla, Tasks API için kullanıcılar tarafından okunabilen özel AUTH_TOKEN_TYPE takma adları mevcuttur. Bunlar, OAuth 2.0 kapsamını kullanmaya eşdeğerdir. Örneğin, şunları kullanabilirsiniz:
String AUTH_TOKEN_TYPE = "Manage your tasks";
Ayrıca AUTH_TOKEN_TYPE takma adını da kullanabilirsiniz: Görevlerinizi görüntüleyin. Bu, Görevler API'si salt okunur kapsama eşdeğerdir: oauth2:https://www.googleapis.com/auth/tasks.readonly.
AccountManager.getAuthToken() çağrısı sırasında AccountManager, uygulamanızın Görevler API'sine erişim yetkisi olup olmadığını kontrol eder. Uygulamanız henüz yetkilendirilmediyse AccountManager tarafından bir Etkinlik başlatılır. Hesap Yöneticisi, uygulamanızın kendi hesabında Görevler API'sini kullanmasına İzin Verme veya Reddetme için kullanıcıya bir yetkilendirme iletişim kutusu görüntüler.
Kullanıcı, uygulamanızın Tasks API'ye erişimini reddederse OperationCanceledException çağrısı sırasında bir OperationCanceledException verilir. Örneğin, hesabı yeniden seçmenizi isteyebilir veya erişimi yeniden yetkilendirmek için düğme içeren bir mesaj görüntüleyebilirsiniz.
Uygulamanızı tanımlama ve Tasks API hizmeti Nesnesini ayarlama
Uygulamanız Görevler API'sine erişme yetkisine sahip olduğu ve kendisine bir erişim jetonu verildiğine göre, Tasks API çağrıları yapmak için zorunlu olduğundan, Google API Konsolu'nda bir projeden almanız gereken bir API Anahtarı da almanız gerekir. Bunun için aşağıdaki adımları uygulayın:
- Yeni bir proje oluşturun veya mevcut bir projeyi kullanın
- Tasks API anahtarını AÇIK konuma getirerek projenizde Tasks API'yi etkinleştirin.
- API Anahtarı, API Erişimi > Basit API Erişimi > API Anahtarı konumunda bulunabilir.
API Anahtarı, uygulamanızı tanımladığından zorunludur ve API'nin kotayı düşmesine ve projeniz için tanımlanan kota kurallarını kullanmasına olanak tanır. Görevler hizmeti nesnenizde API Anahtarı'nı belirtmeniz gerekir:
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 yalnızca belirli bir süre için geçerlidir. Bu nedenle, geçerlilik süresi sona erdiğinde yeni bir erişim kodu almanız gerekir. Bunu başarmanın 2 yolu vardır:
- API üzerinden her istek gönderdiğinizde AccountManager'dan bir accessToken isteyin. AccountManager jetonu önbelleğe aldığından bu çözüm kabul edilebilir.
- 403 hatası alana kadar accessToken bilginizi kullanmaya devam edin. Bu noktada AccountManager'dan yeni bir jeton isteyin.
API aracılığıyla Görevleri Manipüle Etme
Bu noktada, API'yi sorgulamak için Görevler API'si Geliştirici Kılavuzu'na uygun şekilde kullanabileceğiniz, tam olarak ayarlanmış bir Tasks API hizmeti Nesneniz olmalıdır. Örneğin:
// 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 uygulama manifestinize internete erişim iznini eklemeyi unutmayın. Aksi takdirde, Görevler API'si uç noktalarına yapılan yukarıdaki istekler başarısız olur:
<uses-permission android:name="android.permission.INTERNET" />
Örnek uygulama
Kısa süre önce, Android'de Tasks API'yi ve OAuth 2.0'ı kullanmaya başlamanıza yardımcı olmak amacıyla, Java için Google API'leri İstemci Kitaplığı'na yeni bir örnek ekledik. Örnek, Görevler API'sini kullanmak ve varsayılan görev listesinin görevlerini ListView'da görüntülemek için yetkilendirme isteyen basit ancak tam olarak çalışan bir Android uygulamasıdır.
Örneği çalıştırmak için bu instructions uygulayın ve geri bildirimlerinizi veya sorularınızı Google Tasks API Forumu'nda yayınlamaktan çekinmeyin.