我正在使用 Google 跨客户身份。我为此遵循的程序是:
a) 在 Google API 控制台中创建一个项目。b)为已安装的应用程序(Android)生成客户端 ID c)为 Web 应用程序生成客户端 ID。d) 在他/她在 Android 端验证后,我必须在服务器端(离线)使用用户的 Google Drive。
为此,我创建了这样的范围:
字符串 CLIENT_ID = "60000000007.apps.googleusercontent.com"; 字符串范围 = "server:client_id:"+CLIENT_ID+":api_scope:"+DriveScopes.DRIVE+" "+" https://www.googleapis.com/auth/plus.login ";
现在我必须检索身份验证代码,我必须将其转发到我的服务器端。为此,这是我的完整源代码:
package com.example.googleaccess;
import java.io.IOException;
import android.accounts.AccountManager;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import com.google.android.gms.auth.GoogleAuthException;
import com.google.android.gms.auth.GoogleAuthUtil;
import com.google.android.gms.auth.GooglePlayServicesAvailabilityException;
import com.google.android.gms.auth.UserRecoverableAuthException;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.Scopes;
import com.google.android.gms.plus.PlusClient;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.services.drive.DriveScopes;
public class MainActivity extends Activity {
private String accountName = null;
private GoogleAccountCredential credential;
private int REQUEST_ACCOUNT_PICKER = 2;
private int REQUEST_AUTHORIZATION = 11;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String CLIENT_ID = "60000000007.apps.googleusercontent.com";
String scope = "server:client_id:"+CLIENT_ID+":api_scope:"+DriveScopes.DRIVE+" "+"https://www.googleapis.com/auth/plus.login";
credential = GoogleAccountCredential.usingOAuth2(MainActivity.this, scope);
startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
GooglePlayServicesUtil.isGooglePlayServicesAvailable(MainActivity.this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return false;
}
class Async extends AsyncTask<Void, Void, Void> {
Context credential = null;
public Async(Context credential) {
this.credential = credential;
}
@Override
protected Void doInBackground(Void... params) {
getAccessToken(credential);
return null;
}
}
public void getAccessToken(Context mContext) {
try {
String token = credential.getToken();
Log.d("Token", "token:"+token);
} catch (GooglePlayServicesAvailabilityException playEx) {
playEx.getMessage();
playEx.printStackTrace();
}catch (UserRecoverableAuthException e) {
e.printStackTrace();
Log.d("Token", "token:"+e.getCause());
startActivityForResult(e.getIntent(), REQUEST_AUTHORIZATION);
} catch (IOException e) {
e.printStackTrace();
Log.d("Token", "token:"+e.getMessage());
} catch (GoogleAuthException e) {
e.printStackTrace();
Log.d("Token", "token:"+e.getMessage());
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_ACCOUNT_PICKER) {
if (resultCode == RESULT_OK && data != null && data.getExtras() != null) {
accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
if (accountName != null) {
credential.setSelectedAccountName(accountName);
new Async(getApplicationContext()).execute();
}
}
}
if(requestCode == REQUEST_AUTHORIZATION) {
if (resultCode == Activity.RESULT_OK) {
data.getExtras();
new Async(getApplicationContext()).execute();
} else {
startActivityForResult(credential.newChooseAccountIntent(), REQUEST_ACCOUNT_PICKER);
}
}
}
}
在这里,我正在处理 UserRecoverableAuthException 以便用户可以验证应用程序。
这段代码一切正常,当被问及访问数据的权限时,我允许它通过设备。但是我再次通过相同的异常获取屏幕以将应用程序验证为 getToken()。我不知道我缺什么地方。
如果我必须使用范围仅检索访问令牌,我的代码也可以正常工作:
String scope = "oauth2:"+DriveScopes.DRIVE;
还有一个奇怪的问题,我在模拟器 4.2 Google API 17 版本上遇到了这个代码工作正常。但不在任何设备上。
这是我的 Logcat 代码:
07-23 18:03:36.992: W/GLSActivity(9639): [qq] Status from wire: NeedPermission status: NEED_PERMISSION
07-23 18:03:37.414: W/System.err(9626): com.google.android.gms.auth.UserRecoverableAuthException: NeedPermission
07-23 18:03:37.414: W/System.err(9626): at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
07-23 18:03:37.414: W/System.err(9626): at com.example.googleaccess.MainActivity.getAccessToken(MainActivity.java:84)
07-23 18:03:37.414: W/System.err(9626): at com.example.googleaccess.MainActivity$Async.doInBackground(MainActivity.java:67)
07-23 18:03:37.421: W/System.err(9626): at com.example.googleaccess.MainActivity$Async.doInBackground(MainActivity.java:1)
07-23 18:03:37.421: W/System.err(9626): at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-23 18:03:37.421: W/System.err(9626): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)