gpt4 book ai didi

android - 通过访问 token 创建 GoogleCredential

转载 作者:行者123 更新时间:2023-11-29 01:34:59 24 4
gpt4 key购买 nike

我想为 Google Drive 设计一个 Android 文件查看器。

首先,我使用 Google Android API 实现了该应用程序,如下所示,

private void retrieveNextPage(){

if(mHasMore == false)
return;

Query query = new Query.Builder().setPageToken(mNextPageToken).build();
com.google.android.gms.drive.Drive.DriveApi.query(getGoogleApiClient(), query).setResultCallback(metadataBufferResultResultCallback);

}

但是,Android Drive API 只允许应用程序查看和获取自己创建的文件。我无法通过该应用程序访问驱动器上的其他文件。

因此,我转向了另一种选择,直接操作Java Drive API。

根据Java开发者指南的例子,

https://developers.google.com/drive/web/quickstart/quickstart-java

用户必须在浏览器和应用程序之间手动复制和粘贴“授权码”,这在 Android 中不是一种获取访问 token 的实用方法。

另辟蹊径,我使用Android API中的GoogleAuthUtil获取Access Token,恰逢GoogleCredentialDrive在 Java API 中获取文件列表,如下所示,

private static List<File> retrieveFiles(Drive service) throws IOException{
List<File> result = new ArrayList<File>();
Files.List request = service.files().list();
do {
try{
FileList fileList = request.execute();
result.addAll(fileList.getItems());
request.setPageToken(fileList.getNextPageToken());

}catch (IOException e){
Log.d(dbgT + "JavaRetrieveFiles", "Retrieved Failed");
request.setPageToken(null);
}
}while (request.getPageToken() != null && request.getPageToken().length() > 0);

return result;
}

private class RetrieveTokenTask extends AsyncTask<String, Void, String>{

@Override
protected String doInBackground(String... params){
String accountName = params[0];
String scopes = "oauth2:" + "https://www.googleapis.com/auth/drive";
String token = null;

try{
token = GoogleAuthUtil.getToken(getApplicationContext(), accountName, scopes);
}
catch (IOException e){
Log.e(excpTAG, "IO Exception: " + e.getMessage());
}
catch (UserRecoverableAuthException e){
startActivityForResult(e.getIntent(), REQ_SIGN_IN_REQUIRED);
}
catch (GoogleAuthException e)
{
Log.e(excpTAG, "GoogleAuthException: " + e.getMessage());
}

return token;
}

@Override
protected void onPostExecute(String s){
super.onPostExecute(s);

//Get Access Token
Log.d( dbgT + "Token", s);
EditText tokenText = (EditText) findViewById(R.id.tokenText);
tokenText.setText(s);

EditText fileNameText = (EditText) findViewById(R.id.editTextMeta);

GoogleCredential credential = new GoogleCredential().setAccessToken(s);
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
Drive service = new Drive.Builder(httpTransport, jsonFactory, null).setHttpRequestInitializer(credential).build();

List<File> fileList;
try{
fileList = retrieveFiles(service);
for(int i=0; i< fileList.size(); i++)
fileNameText.append(fileList.get(i).getTitle());
}catch(IOException e){
Log.d(dbgT + "RetrieveFileList", "IO Exception" );
}

}
}

不幸的是,当 retrieveFiles 中的 request.execute() 被调用时,应用程序总是因 NetworkOnMainThreadException 而崩溃。

我检查了我的访问 token s,它通常是ya29.xxx...etc.的形式,它也可以传递给我的其他.NET从 Google Drive 检索文件的程序。因此我可以确定访问 token 是正确的。

所以我的问题是,如何使用访问 token 创建正确的 GoogleCredential,而不是在 setFromTokenResponse 中应用授权代码?

提前致谢。

最佳答案

非常感谢Andy的提示,这个问题很简单是主线程上发生了网络操作导致的,这是一个非常基本的新手错误。

Google Drive SDK for Java 中的 Drive,使用没有任何后台/线程 worker 的网络库,现在在我将 retrieveFiles() 放入后台后它可以正常工作.

应用Google Play Android SDK中的GoogleAuthUtil获取access token,然后Java SDK中的GoogleCredential+Drive使用在 Google 云端硬盘中执行文件操作的 token 。

这是避免 Android SDK for Google Drive 范围限制的正确方法,允许开发者获得访问 Google Drive 的完整许可。

关于android - 通过访问 token 创建 GoogleCredential,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28872697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com