无法为Google云端硬盘创建令牌目录

时间:2019-04-22 11:17:18

标签: android google-drive-api

我正在尝试从一个Android应用连接到Google云端硬盘,该应用最终将从云端硬盘下载音轨。我无法创建/ 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. 失败
  3. tokenFolder.mkdirs();未按预期创建目录,并且未引发异常。

而且,我不理解类名GoogleAuthorizationCodeFlow.Builder的术语-这仅仅是一个带有句号的类名,还是对内部类的引用或其他内容?

1 个答案:

答案 0 :(得分:0)

我希望您最终能解决此“创建/ token /目录” 问题。

如果情况变得更糟,您只需要在知道其Google云端硬盘路径的位置访问MP3文件...

仅用文件ID替换XXXXX。现在将下载MP3字节,以便读入bytearray或在MP3解码器/播放器中用作URL。