Tôi phải triển khai chức năng tải tệp lên Google Drive.
Như trong hướng dẫn Quick Start.Cách sử dụng GoogleAuthorizationCodeFlow với AccessType đang ẩn
Lúc đầu, tôi gọi createLinkAuth để tạo liên kết để lấy mã.
Sau đó generateCode sẽ được thực thi để nhận mã thông báo.
Mọi thứ đều ổn.
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();
}
}
Vấn đề là mã thông báo sẽ hết hạn sau 1 giờ với setAccessType ("trực tuyến"), vì vậy tôi thay đổi thành setAccessType ("ngoại tuyến").
Khi tôi thay đổi và chạy lại ứng dụng Android của mình, tôi gặp lỗi - khi tôi thực thi mã bên dưới.
mResponse = mFlow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
mCredential = new GoogleCredential();
mCredential.setFromTokenResponse(mResponse);
Khi tôi cố gắng để gỡ lỗi trên giao diện điều khiển thực thi mCredential.setFromTokenResponse (mResponse)., ngoại lệ sẽ được nâng lên
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
Tôi làm cách nào để sử dụng accessType ngoại tuyến?
Có điều gì tôi phải sửa đổi để sử dụng với chế độ này không?
Tôi đã giải quyết vấn đề này ... Tôi nên khai báo GoogleCredential bằng cách sử dụng GoogleCredential.Build() thay vì GoogleCredential mới(). – quantm
Xin vui lòng gửi một anser chứ không phải là một bình luận, nếu không câu hỏi vẫn còn trong phần chưa được trả lời – rds
Để hiểu biết của tôi, xin vui lòng kiểm tra xem tôi là đúng. – Bharathi