FileDataStoreFactory и posix на android? - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь создать простое приложение для календаря на android и собирался использовать API календаря Google, и целевого SDK 24 и выше, но я вижу потенциальную проблему, у Google нет эквивалентной реализации для this on android, но у них есть реализация java, которая приводит к другой проблеме, скрытой реализации POSIX, которую я не знаю, как обойти, она находится внутри их new FileDataStoreFactory(...) способ . Каковы мои варианты и есть ли способ обойти это? Если я запускаю на SDK 26, он работает нормально, метод авторизации потока .setDataStoreFactory, но все, что ниже, я получу следующую ошибку:

java.lang.NoClassDefFoundError: Failed resolution of: Ljava/nio/file/attribute/PosixFilePermission;
at com.google.api.client.util.store.FileDataStoreFactory.setPermissionsToOwnerOnly(FileDataStoreFactory.java:141)

// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)

* * * this is the part where i will struggle if i have to use an SDK lower than 26 * * *
.setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH))) 

.setAccessType("offline")
.build();

для получения дополнительной справки, пожалуйста, посмотрите на их github для FileDataStoreFactory class , в строке 77 возникает проблема setPermissionsToOwnerOnly(dataDirectory);

, и после более глубокой копки я считаю, что нашел подсказку, почему Paths не работает внутри FDSF, потому что минимального требования SDK 'Пути были добавлены на уровне API 26'

1 Ответ

0 голосов
/ 27 января 2020

Я обошел это, поэтому я избегал работы с DataStoreFactory, который использует API 26 Paths, и вместо этого я использовал старый добрый mkdir и соответственно изменил его разрешения. После этого я настроил хранилище учетных данных, и теперь мое приложение работает с SDK 24, SDK 25 и SDK 26+ с использованием API-интерфейса Google Calendar. Я также хотел бы упомянуть, что потребовалась некоторая тяжелая работа, чтобы разобраться в устаревших проблемах, связанных с этим, а также погрузиться вручную в фактическую реализацию DataStoreFactory, чтобы лучше понять.

private val TOKENS_DIRECTORY_PATH: String = "tokens"
private val CREDENTIALS_FILE_PATH: String = "credentials.json"

val inputStream: InputStream = activity!!.resources!!.assets!!.open(CREDENTIALS_FILE_PATH)
        val clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, InputStreamReader(inputStream))
        val mDirectory: File? = File(activity.filesDir.absolutePath + File.separator + TOKENS_DIRECTORY_PATH)
        if(!mDirectory!!.exists()){
            mDirectory.mkdir()
            mDirectory.setReadable(true,true)
            mDirectory.setWritable(true,true)
            mDirectory.setExecutable(true,false)
        }
        val mFile = File(mDirectory, CREDENTIALS_FILE_PATH)
        mFile.setReadable(true, true)
        mDirectory.setWritable(true,true)
        mDirectory.setExecutable(true,false)

        val mFileContents: String =
            activity.resources.assets
                .open(CREDENTIALS_FILE_PATH).bufferedReader().use { it.readText() }

        mFile.outputStream().bufferedWriter().use { out ->
            out.write(mFileContents)
        }

        val mCredentialStore: CredentialStore? = FileCredentialStore(mFile, JSON_FACTORY)
        //val fileFactory: FileDataStoreFactory? = FileDataStoreFactory(file)

        this.mFlow = GoogleAuthorizationCodeFlow
            .Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setCredentialStore(mCredentialStore)
            .setAccessType(ACCESS_TYPE)
            .build()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...