android - 无法为 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
发生了两件我不明白的奇怪事情。
它在这条线上失败了
build.setDataStoreFactory(new FileDataStoreFactory(tokenFolder));
tokenFolder.mkdirs();
没有按预期创建目录,也没有抛出异常。
另外,我不理解类名的术语GoogleAuthorizationCodeFlow.Builder
- 这只是一个带有句号的类名还是对内部类或其他东西的引用?
解决方案
我希望你最终能得到这个“创建 /token/ 目录”问题的答案。
如果情况变得更糟,您只需要访问您知道其 Google Drive 路径的 MP3 文件...
变成(通过
String
函数编辑):
https ://drive.google.com/uc?authuser=0&id=XXXXX&export=download
仅替换XXXXX
为您的文件 ID。MP3 字节现在将下载,因此要么读入,要么bytearray
用作 MP3 解码器/播放器中的 URL。
推荐阅读
- javascript - Vue如何添加电话号码通话链接
- c# - C# WPF OnDragMoveWindow 只需单击即可执行?
- python - 绘制从 Pandas 到 Seaborn 的多条线图
- flutter - Flutter Firestore await .getDocuments 花了 30 分钟
- angularjs - 标签的AngularJs路由问题
- .net - Server 2019 上 IIS 上的网站与 SQL Server 2019 CU1 之间的用户“NT AUTHORITY\ANONYMOUS LOGON”消息登录失败
- python - 为什么添加二进制数python时顺序无关紧要
- c++ - 在 C++Builder 2009 中为 TDateTime 添加大量秒数
- node.js - Node.js 多域虚拟主机
- sql - 不同时的零记录