Исключение из SDK на Google Диске

Я пытаюсь запустить следующий код (взятый в значительной степени от Стивена Уайли ):

package com.googledrive.googledriveapp; // For Google Drive / Play Services // Version 1.1 - Added new comments & removed dead code // Stephen Wylie - 10/20/2012 import java.io.IOException; import java.util.ArrayList; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import com.google.android.gms.auth.GoogleAuthException; import com.google.android.gms.auth.GoogleAuthUtil; import com.google.android.gms.auth.UserRecoverableAuthException; import com.google.android.gms.common.AccountPicker; import com.google.api.client.auth.oauth2.BearerToken; import com.google.api.client.auth.oauth2.Credential; import com.google.api.client.extensions.android2.AndroidHttp; import com.google.api.client.googleapis.extensions.android2.auth.GoogleAccountManager; import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.json.JsonHttpRequest; import com.google.api.client.http.json.JsonHttpRequestInitializer; import com.google.api.client.json.jackson.JacksonFactory; import com.google.api.services.drive.Drive; import com.google.api.services.drive.Drive.Apps.List; import com.google.api.services.drive.Drive.Files; import com.google.api.services.drive.DriveRequest; import com.google.api.services.drive.DriveScopes; import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.FileList; public class MainActivity extends Activity { private static final int CHOOSE_ACCOUNT=0; private static String accountName; private static int REQUEST_TOKEN=0; private Button btn_drive; private Context ctx = this; private Activity a = this; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set up the GUI layout setContentView(R.layout.activity_main); // set the variables to access the GUI controls btn_drive = (Button) findViewById(R.id.btn_drive); btn_drive.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { chooseAccount(); } }); } public void chooseAccount() { Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"}, false, null, null, null, null); startActivityForResult(intent, CHOOSE_ACCOUNT); } // Fetch the access token asynchronously. void getAndUseAuthTokenInAsyncTask(Account account) { AsyncTask<Account, String, String> task = new AsyncTask<Account, String, String>() { ProgressDialog progressDlg; AsyncTask<Account, String, String> me = this; @Override protected void onPreExecute() { progressDlg = new ProgressDialog(ctx, ProgressDialog.STYLE_SPINNER); progressDlg.setMax(100); progressDlg.setTitle("Validating..."); progressDlg.setMessage("Verifying the login data you entered...\n\nThis action will time out after 10 seconds."); progressDlg.setCancelable(false); progressDlg.setIndeterminate(false); progressDlg.setOnCancelListener(new android.content.DialogInterface.OnCancelListener() { public void onCancel(DialogInterface d) { progressDlg.dismiss(); me.cancel(true); } }); progressDlg.show(); } @Override protected String doInBackground(Account... params) { return getAccessToken(params[0]); } @Override protected void onPostExecute(String s) { if (s == null) { // Wait for the extra intent } else { accountName = s; getDriveFiles(); } progressDlg.dismiss(); } }; task.execute(account); } /** * Fetches the token from a particular Google account chosen by the user. DO NOT RUN THIS DIRECTLY. It must be run asynchronously inside an AsyncTask. * @param activity * @param account * @return */ private String getAccessToken(Account account) { try { return GoogleAuthUtil.getToken(ctx, account.name, "oauth2:" + DriveScopes.DRIVE); // IMPORTANT: DriveScopes must be changed depending on what level of access you want } catch (UserRecoverableAuthException e) { // Start the Approval Screen intent, if not run from an Activity, add the Intent.FLAG_ACTIVITY_NEW_TASK flag. a.startActivityForResult(e.getIntent(), REQUEST_TOKEN); e.printStackTrace(); return null; } catch (GoogleAuthException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } } private Drive getDriveService() { HttpTransport ht = AndroidHttp.newCompatibleTransport(); // Makes a transport compatible with both Android 2.2- and 2.3+ JacksonFactory jf = new JacksonFactory(); // You need a JSON parser to help you out with the API response Credential credential = new Credential(BearerToken.authorizationHeaderAccessMethod()).setAccessToken(accountName); HttpRequestFactory rf = ht.createRequestFactory(credential); Drive.Builder b = new Drive.Builder(ht, jf, null); b.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() { @Override public void initialize(JsonHttpRequest request) throws IOException { DriveRequest driveRequest = (DriveRequest) request; driveRequest.setPrettyPrint(true); driveRequest.setOauthToken(accountName); } }); return b.build(); } /** * Obtains a list of all files on the signed-in user's Google Drive account. */ private void getDriveFiles() { Drive service = getDriveService(); Log.d("SiteTrack", "FUNCTION getDriveFiles()"); Files.List request; try { request = service.files().list(); // .setQ("mimeType=\"text/plain\""); } catch (IOException e) { e.printStackTrace(); return; } do { FileList files; try { System.out.println("got here"); Log.d("SiteTrack", request.toString()); **files = request.execute();** } catch (IOException e) { e.printStackTrace(); Log.d("SiteTrack", "Exception"); return; } ArrayList<File> fileList = (ArrayList<File>) files.getItems(); Log.d("SiteTrack", "Files found: " + files.getItems().size()); for (File f : fileList) { String fileId = f.getId(); String title = f.getTitle(); Log.d("SiteTrack", "File " + fileId + ": " + title); } request.setPageToken(files.getNextPageToken()); } while (request.getPageToken() != null && request.getPageToken().length() >= 0); } protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { if (requestCode == CHOOSE_ACCOUNT && resultCode == RESULT_OK) { accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); GoogleAccountManager gam = new GoogleAccountManager(this); getAndUseAuthTokenInAsyncTask(gam.getAccountByName(accountName)); Log.d("SiteTrack", "CHOOSE_ACCOUNT"); } else if (requestCode == REQUEST_TOKEN && resultCode == RESULT_OK) { accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME); Log.d("SiteTrack", "REQUEST_TOKEN"); } } } 

Однако я получаю следующее исключение:

 11-19 16:35:27.758: W/System.err(23287): com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden 11-19 16:35:27.758: W/System.err(23287): { 11-19 16:35:27.758: W/System.err(23287): "code" : 403, 11-19 16:35:27.758: W/System.err(23287): "errors" : [ { 11-19 16:35:27.758: W/System.err(23287): "domain" : "usageLimits", 11-19 16:35:27.762: W/System.err(23287): "message" : "Access Not Configured", 11-19 16:35:27.762: W/System.err(23287): "reason" : "accessNotConfigured" 11-19 16:35:27.762: W/System.err(23287): } ], 11-19 16:35:27.762: W/System.err(23287): "message" : "Access Not Configured" 11-19 16:35:27.762: W/System.err(23287): } 11-19 16:35:27.762: W/System.err(23287): at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:237) 11-19 16:35:27.762: W/System.err(23287): at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207) 11-19 16:35:27.762: W/System.err(23287): at com.google.api.services.drive.Drive$Files$List.execute(Drive.java:1071) 11-19 16:35:27.762: W/System.err(23287): at com.googledrive.googledriveapp.MainActivity.getDriveFiles(MainActivity.java:173) 11-19 16:35:27.762: W/System.err(23287): at com.googledrive.googledriveapp.MainActivity.access$3(MainActivity.java:156) 11-19 16:35:27.762: W/System.err(23287): at com.googledrive.googledriveapp.MainActivity$2.onPostExecute(MainActivity.java:104) 11-19 16:35:27.765: W/System.err(23287): at com.googledrive.googledriveapp.MainActivity$2.onPostExecute(MainActivity.java:1) 11-19 16:35:27.765: W/System.err(23287): at android.os.AsyncTask.finish(AsyncTask.java:417) 11-19 16:35:27.765: W/System.err(23287): at android.os.AsyncTask.access$300(AsyncTask.java:127) 11-19 16:35:27.765: W/System.err(23287): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 11-19 16:35:27.765: W/System.err(23287): at android.os.Handler.dispatchMessage(Handler.java:99) 11-19 16:35:27.765: W/System.err(23287): at android.os.Looper.loop(Looper.java:123) 11-19 16:35:27.765: W/System.err(23287): at android.app.ActivityThread.main(ActivityThread.java:4627) 11-19 16:35:27.765: W/System.err(23287): at java.lang.reflect.Method.invokeNative(Native Method) 11-19 16:35:27.769: W/System.err(23287): at java.lang.reflect.Method.invoke(Method.java:521) 11-19 16:35:27.769: W/System.err(23287): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 11-19 16:35:27.769: W/System.err(23287): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 11-19 16:35:27.769: W/System.err(23287): at dalvik.system.NativeStart.main(Native Method) 

Который отслеживает строки files = request.execute(); В моем коде выше (я отметил его звездочками). Я включил как SDK Drive, так и Drive API в свою консоль Google API. Вот несколько снимков настроек моего накопителя SDK: Введите описание изображения здесьВведите описание изображения здесь В разделе идентификатора клиента, которое не отображается, я просто вставил «Идентификатор клиента для установленных приложений» из раздела «Доступ к API» (я также попробовал «Идентификатор клиента для SDK накопителя»). Кто-нибудь знает, в чем проблема?

EDITED: Извините, я просто понял, что мы можем подписать apk в режиме отладки с помощью debug.keystore. Итак, самое главное – вставить правильный ключ SHA1 в консоль Google API. (Сгенерированный с использованием инструмента JRE7, о котором упоминал Стивен Уайли в своем сообщении в Google+)

Также см. (Developer.android.com/tools/publishing/app-signing.html#debugmode) для пароля хранилища ключей.

После некоторых проб и ошибок, я, наконец, смог перечислить файлы на моем диске Google Хотя я не уверен, является ли это самым правильным ответом, но, по крайней мере, я могу теперь перечислить файлы

Во-первых, пожалуйста, обратитесь к Стивену Уайли, обновленному сообщению Google+ https://plus.google.com/u/0/114042449736049687152/posts/CD3L8zcJg5Z

Сгенерируйте ключ SHA1 с помощью .keystore с помощью инструмента JRE7

Я использую файл .keystore, который я использовал с моим магазином воспроизведения Google. Если у вас нет хранилища ключей, вы можете перейти к своему проекту, нажать «Экспорт», а затем попросит вас создать файл .keystore)

С созданным ключом SHA1, перейдите на консоль Google API (лучше всего, если вы начинаете с нового, удаляете текущий проект и начинаете новый)

Доступный API

-разъемный SDK

-go для доступа к API

-создать идентификатор клиента

-Именно, выберите Установленное приложение и Android

-ALSO ВАЖНО, введите свой сгенерированный ключ SHA1

-key в имени вашего CORRECT (com.example.xxx), которое вы используете в своем проекте eclipse

-Добавить вкладку SDK-загрузки

-Именно, введите свой идентификатор клиента (идентификатор клиента для установленных приложений) со вкладки API Access

-Включить 3 области, упомянутых в сообщении Стивена Уайли, [/userinfo.email, /userinfo.profile, / auth / drive]

-Изменить URL-адрес

Поддержка нескольких файлов

Снова убедитесь, что ваше имя пакета в коде совпадает с именем пакета, которое вы вставляете в консоль Google API

Наконец, в eclipse экспортируйте свой проект с помощью файла .keystore, который вы создали сейчас

Поместите экспортированный файл APK в свой телефон, установите и попробуйте.

Проверьте свой LogCat, чтобы отобразить перечисленные файлы с вашего Google Диска.

Мне это удалось.

EDITED: Если вы сгенерировали ключ SHA1 с помощью debug.keystore, вы можете пропустить часть «Экспорт». Просто отлаживайте свое приложение в порядке. Eclipse автоматически подпишет apk с помощью debug.keystore.

EDITED: в следующий раз, когда ваш код будет готов, вам необходимо создать новый ключ SHA1 с вашим реальным .keystore, а затем ввести его в консоль Google API.

EDITED 2: убедитесь, что ваш манифест включает эти

 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> 

Банки, которые я использовалимпорт

Я тоже столкнулся с этой проблемой и вскоре понял, что включил неправильную «службу» в «Консоль API Google> Службы». Попробуйте свое приложение после включения «Drive API» вместо «Drive SDK».

1) Перейдите на страницу https://code.google.com/apis/console.
2) Выберите правильное приложение / проект из выпадающего меню
3) Перейдите в раздел «Услуги»
4) Включить 'ON' 'Drive API'