android上的FileDataStoreFactory和posix?

android上的FileDataStoreFactory和posix?,android,google-calendar-api,Android,Google Calendar Api,我正在考虑在android上制作一个简单的日历应用程序,并考虑使用google calendar API和target SDK 24及更高版本,但我发现了一个潜在的问题,google没有android上的等效实现,但他们有java实现,这导致了另一个问题,一个隐藏的POSIX实现,我不知道如何使用,它在他们的新FileDataStoreFactory(…)中。我的选择是什么?有没有办法解决这个问题?如果我在SDK 26上运行,它可以正常工作,即authorization flow.setData

我正在考虑在android上制作一个简单的日历应用程序,并考虑使用google calendar API和target SDK 24及更高版本,但我发现了一个潜在的问题,google没有android上的等效实现,但他们有java实现,这导致了另一个问题,一个隐藏的POSIX实现,我不知道如何使用,它在他们的
新FileDataStoreFactory(…)
中。我的选择是什么?有没有办法解决这个问题?如果我在SDK 26上运行,它可以正常工作,即authorization flow.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,第77行是问题发生的地方
SetPermissionsTowneronly(dataDirectory)


在做了更多的挖掘之后,我相信我已经找到了一条线索,为什么路径在FDSF中不起作用,因为最小的“路径是在API级别26中添加的”

我已经解决了这个问题,所以我避免了使用API 26路径的DataStoreFactory,相反,我使用了一个好的旧mkdir并相应地更改了它的权限。之后,我用一个凭证库进行了设置,现在我的应用程序正在使用google日历api与SDK 24、SDK 25和SDK 26+一起工作。我还想提到的是,为了更好地理解DataStoreFactory的实际实现,挖掘与此相关的过时问题,以及手动挖掘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()

现在不需要任何解决方法。谷歌在2020年7月的commit版本中增加了对Android 8(API 28)以下较低版本(API 19+)的支持。只需输入这个

import com.google.api.client.extensions.android.util.store.FileDataStoreFactory
在您使用的文件中,并将此依赖项添加到应用程序的build.gradle文件中

// Replace 1.38.1 with latest version number from https://github.com/googleapis/google-http-java-client/releases
implementation 'com.google.http-client:google-http-client-android:1.38.1'