首页 > 解决方案 > 无法为 Google Drive 创建令牌目录

问题描述

我正在尝试从最终会从云端硬盘下载音轨的 Android 应用程序连接到 Google Drive。我无法为身份验证创建 /token/ 目录。

我已经拆分了创建的过程,GoogleAuthorizationCodeFlow以显示该过程在失败之前的进展情况。我还尝试预先创建 /token/ 目录,这也失败了。

这是相关的代码。因为我使用的是内部存储,所以清单文件中没有请求任何权限。

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.i("LOGLEARN", "Starting AlarmReceiver");
        Drive service;
        try {
            HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();
            service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                    .setApplicationName("Morning Learning")
                    .build();

            FileList result = service.files().list()
                    .setPageSize(10)
                    .setFields("nextPageToken, files(id, name)")
                    .execute();
            List<File> files = result.getFiles();
            if (files == null || files.isEmpty()) {
                Log.i(DEBUG,"No files found.");
            } else {
                Log.i(DEBUG, "Files:");
                for (File file : files) {
                    Log.i(DEBUG, "%s (%s) - " + file.getName() + file.getId());
                }
            }
        } catch (Exception exception) {
            // Handle Exception here
            Log.i(DEBUG, "Exception: " + exception.toString());
        }
    }

    private static Credential getCredentials(final HttpTransport HTTP_TRANSPORT) throws IOException {
        String DEBUG = "LOGLEARN";
        // Load client secrets.
        InputStream in = AlarmReceiver.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        java.io.File tokenFolder = new java.io.File(Environment.getDataDirectory() +
                java.io.File.separator + TOKENS_DIRECTORY_PATH);
        if (!tokenFolder.exists()) {
            Log.i(DEBUG, "Token Folder does not exist " + tokenFolder.toString());
            tokenFolder.mkdirs();
        }

        if (!tokenFolder.exists()) {
            Log.i(DEBUG, "Token Folder still does not exist " + tokenFolder.toString());
        } else {
            Log.i(DEBUG, "Token Folder now exists " + tokenFolder.toString());
        }

        GoogleAuthorizationCodeFlow.Builder build = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES);
        Log.i(DEBUG, "Checkpoint 1");

        build.setDataStoreFactory(new FileDataStoreFactory(tokenFolder));

        Log.i(DEBUG, "Checkpoint 2");
        build.setAccessType("offline");

        Log.i(DEBUG, "Checkpoint 3");
        GoogleAuthorizationCodeFlow flow = build.build();

        Log.i(DEBUG, "Checkpoint end");

        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    }

我希望将某种文件列表写入 LogCat,但我得到以下内容:

 I/LOGLEARN: Starting AlarmReceiver
 I/LOGLEARN: Token Folder does not exist /data/tokens
 I/LOGLEARN: Token Folder still does not exist /data/tokens
 I/LOGLEARN: Checkpoint 1
 I/LOGLEARN: Exception: java.io.IOException: unable to create directory: /data/tokens

发生了两件我不明白的奇怪事情。

  1. 它在这条线上失败了build.setDataStoreFactory(new FileDataStoreFactory(tokenFolder));

  2. tokenFolder.mkdirs();没有按预期创建目录,也没有抛出异常。

另外,我不理解类名的术语GoogleAuthorizationCodeFlow.Builder- 这只是一个带有句号的类名还是对内部类或其他东西的引用?

标签: androidgoogle-drive-api

解决方案


我希望你最终能得到这个“创建 /token/ 目录”问题的答案。

如果情况变得更糟,您只需要访问您知道其 Google Drive 路径的 MP3 文件...

仅替换XXXXX为您的文件 ID。MP3 字节现在将下载,因此要么读入,要么bytearray用作 MP3 解码器/播放器中的 URL。


推荐阅读