Как мне исправить Java .io.IOException, возникающее на Android при попытке аутентификации для Spreadsheets api? - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь создать простое приложение 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#.

Любое идеи были бы оценены!

...