Android 如何将GoogleAuthorizationCodeFlow与AccessType脱机一起使用
我必须实现将文件上传到Google Drive的功能。Android 如何将GoogleAuthorizationCodeFlow与AccessType脱机一起使用,android,google-drive-api,Android,Google Drive Api,我必须实现将文件上传到Google Drive的功能。 如指南所示 首先,我调用generateLinkAuth生成链接以获取代码。 然后将执行generateCode以获取令牌。 一切都很好 List<String> SCOPES = Arrays.asList("https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/userinfo.email",
如指南所示 首先,我调用generateLinkAuth生成链接以获取代码。
然后将执行generateCode以获取令牌。
一切都很好
List<String> SCOPES = Arrays.asList("https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/userinfo.email",
"https://www.googleapis.com/auth/userinfo.profile", DriveScopes.DRIVE);
public String generateLinkAuth() {
mHttpTransport = new NetHttpTransport();
mJsonFactory = new JacksonFactory();
mFlow = new GoogleAuthorizationCodeFlow.Builder(mHttpTransport, mJsonFactory, CLIENT_ID, CLIENT_SECRET, SCOPES).setAccessType("online").setApprovalPrompt("force").build();
String url = mFlow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
System.out.println("url :" + url);
return url;
}
public void generateCode(String code) {
new GetCredentialFromCode(mContext, code).execute();
}
class GetCredentialFromCode extends AsyncTask<Void, Void, Void> {
private Context mContext;
private String code;
private final ProgressDialog mDialog;
public GetCredentialFromCode(Context context, String cd) {
mContext = context;
mDialog = new ProgressDialog(context);
mDialog.show();
mDialog.setTitle("Uploading ...");
code = cd;
}
@Override
protected Void doInBackground(Void... params) {
if (mFlow != null) {
try {
mResponse = mFlow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
mCredential = new GoogleCredential();
mCredential.setFromTokenResponse(mResponse);
String accessToken = mCredential.getAccessToken();
Editor edit = mPrefs.edit();
edit.putString(GOOGLE_DRIVE_TOKEN, accessToken);
edit.commit();
String accessTokenSave = mPrefs.getString(GOOGLE_DRIVE_TOKEN, "NO KEY");
Log.e(TAG, "access Token Saved is " + accessTokenSave);
} catch (IOException e) {
Editor edit = mPrefs.edit();
edit.putString(GOOGLE_DRIVE_TOKEN, "NO KEY");
e.printStackTrace();
}
}
String accessTokenSave = mPrefs.getString(GOOGLE_DRIVE_TOKEN, "NO KEY");
mHttpTransport = new NetHttpTransport();
mJsonFactory = new JacksonFactory();
mCredential = new GoogleCredential().setAccessToken(accessTokenSave);
getUserInfo();
mDriveService = new Drive.Builder(mHttpTransport, mJsonFactory, mCredential).build();
return null;
}
@Override
protected void onPostExecute(Void result) {
mDialog.dismiss();
GoogleDriveLogInAct act= (GoogleDriveLogInAct) mContext;
act.goBackSettingScreen();
}
}
当我尝试在控制台上调试时,执行mCredential.setFromTokenResponse(mResponse),将提出一个例外
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:278)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.IllegalArgumentException: Please use the Builder and call setJsonFactory, setTransport and setClientSecrets
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setRefreshToken(GoogleCredential.java:294)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setRefreshToken(GoogleCredential.java:153)
at com.google.api.client.auth.oauth2.Credential.setFromTokenResponse(Credential.java:556)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setFromTokenResponse(GoogleCredential.java:313)
at com.jp.shotdocs.libs.GoogleDriveLib$GetCredentialFromCode.doInBackground(GoogleDriveLib.java:168)
at com.jp.shotdocs.libs.GoogleDriveLib$GetCredentialFromCode.doInBackground(GoogleDriveLib.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4 more
如何脱机使用accessType?要使用此模式,有什么需要修改的吗?(在评论中回答。请参阅) OP写道: 我们已经解决了这个问题。。。我应该使用
GoogleCredential.Build()
而不是new GoogleCredential()
来声明GoogleCredential
我已经解决了这个问题。。。我应该使用GoogleCredential.Build()而不是new GoogleCredential()来声明GoogleCredential。请发表回复而不是评论,否则问题仍在未回答部分。据我所知,请检查我是否正确。
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:278)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.IllegalArgumentException: Please use the Builder and call setJsonFactory, setTransport and setClientSecrets
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setRefreshToken(GoogleCredential.java:294)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setRefreshToken(GoogleCredential.java:153)
at com.google.api.client.auth.oauth2.Credential.setFromTokenResponse(Credential.java:556)
at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.setFromTokenResponse(GoogleCredential.java:313)
at com.jp.shotdocs.libs.GoogleDriveLib$GetCredentialFromCode.doInBackground(GoogleDriveLib.java:168)
at com.jp.shotdocs.libs.GoogleDriveLib$GetCredentialFromCode.doInBackground(GoogleDriveLib.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 4 more