Я пытаюсь создать простое приложение Java Android, которое отправляет строки в электронную таблицу Google. Я использую Google api quickstart / sample как основу своего кода, но каким-то образом мне удалось заставить его выйти из строя. Проблемы возникают в части аутентификации.
private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
InputStream in = GIO.class.getResourceAsStream("credentials.json");
GoogleClientSecrets SECRET = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(in));
List<String> SCOPE = Arrays.asList(SheetsScopes.SPREADSHEETS);
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(new com.google.api.client.http.javanet.NetHttpTransport(), JacksonFactory.getDefaultInstance(), SECRET, SCOPE)
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File("tokens"))).setAccessType("offline").build();
Credential cred = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
return cred;
}
Проблема в том, что, что бы я ни пытался, я все равно получаю java.io.IOException: unable to create directory: /tokens
каждый раз, когда пытаюсь запустить его.
W/System.err: java.io.IOException: unable to create directory: /tokens
at com.google.api.client.util.store.FileDataStoreFactory.<init>(FileDataStoreFactory.java:71)
at com.luxeder.bookkeepingapp4.GIO.getCredentials(GIO.java:135)
W/System.err: at com.luxeder.bookkeepingapp4.GIO.createSheetsService(GIO.java:118)
at com.luxeder.bookkeepingapp4.GIO.doInBackground(GIO.java:75)
at com.luxeder.bookkeepingapp4.GIO.doInBackground(GIO.java:49)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Он был протестирован в эмуляторе AVD и на реальном телефоне, оба работали Android Q. У меня есть <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
в манифесте, и я даже запросил разрешение на выполнение для внешнего хранилища, чтобы исключить это, со следующим:
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
1);
На самом деле у меня нет опыта разработки Android (или Java), я пытаюсь воссоздать приложение, созданное в C#.
Любое идеи были бы оценены!