Java 无法使用我的服务对象连接到我的google端点
我已经从我的端点生成了我的客户端库,并且为我的已验证调用向端点传递了适当的凭据(客户端ID是100%正确的) 但我在运行代码时仍会遇到此错误:Java 无法使用我的服务对象连接到我的google端点,java,android,google-cloud-endpoints,google-client,service-object,Java,Android,Google Cloud Endpoints,Google Client,Service Object,我已经从我的端点生成了我的客户端库,并且为我的已验证调用向端点传递了适当的凭据(客户端ID是100%正确的) 但我在运行代码时仍会遇到此错误: com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCreden
com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAuthIOException
at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:286)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859)
at com.projects.malaysiakini.Home$ContentApi.doInBackground(Home.java:165)
at com.projects.malaysiakini.Home$ContentApi.doInBackground(Home.java:141)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: com.google.android.gms.auth.GoogleAuthException: Unknown
at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:255)
at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:279)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859)
at com.projects.malaysiakini.Home$ContentApi.doInBackground(Home.java:165)
at com.projects.malaysiakini.Home$ContentApi.doInBackground(Home.java:141)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
下面是我的代码:
private class ContentApi extends AsyncTask<Void,Void,String>{
@Override
protected String doInBackground(Void... params) {
String response = null;
try {
settings = getActivity().getSharedPreferences("MApi", Context.MODE_PRIVATE);
credential = GoogleAccountCredential.usingAudience(getActivity(), CLIENT_ID);
setSelectedAccountName(settings.getString(PREF_ACCOUNT_NAME, null));
Core.Builder builder = new Core.Builder(AndroidHttp.newCompatibleTransport(), new AndroidJsonFactory(), credential);
builder.setApplicationName(getActivity().getPackageName());
service = builder.build();
if (credential.getSelectedAccountName() != null) {
// Already signed in, begin app!
response = service.info().execute().getLang();
}//end if
else {
chooseAccount();
}
}//end try
catch(IOException ex){
Log.d("MkiniCore", ex.getMessage(), ex);
}//end catch
return response;
}//end doInBackground
@Override
protected void onPostExecute(String s) {
textView.setText(s);
}
}
这是setSelectedAccountName方法
private void setSelectedAccountName(String accountName){
SharedPreferences.Editor editor = settings.edit();
editor.putString(PREF_ACCOUNT_NAME, accountName);
editor.commit();
credential.setSelectedAccountName(accountName);
this.accountName = accountName;
}//end setSelectedAccountName
在调用
.build()
之前,需要在生成器中设置应用程序包名称:
此外,如果这是一个经过身份验证的呼叫,您必须通过帐户选择器运行用户以选择一个Google帐户,并在凭据中设置该帐户:
String accountName = ...; // Pull from where ever you are storing it
credential.setSelectedAccountName(accountName);
此外,从提供的代码中看,客户ID对受众(范围)的作用并不明显,因此请确保其格式为:
static final String CLIENT_ID = "server:client_id:" + YOUR_WEB_APP_CLIENT_ID;
由于您使用的是云端点生成的库,因此不必设置根URL或使用原始HTTP请求/响应。端点生成的库已经在为您执行HTTP请求准备和HTTP响应JSON解析。在没有看到您的云API的情况下,我猜您的“category”云方法会返回一个建模为category
的东西,它有一个成员字段detail
,可以使用gettergetDetail()检索该字段:
我只是那样做了。。它仍然给了我同样的错误好吧,我意识到还有一些其他的事情需要注意,看看我刚才对答案所做的编辑。我已经相应地调整了代码,但没有收到另一个错误。。检查我的问题。。我根据自己的观点编辑了我的问题,我只是用自己的观点尝试了一下,但仍然给出了同样的错误。。然后我发现是SHA1指纹错了。。。所以我把它改成了正确的。它终于收到了一张代币。。。。。所以我现在想在真正的交易中尝试一下……非常感谢。添加builder.setApplicationName(getActivity().getPackageName());将我的客户端id从android更改为web,这里是静态的最终字符串client\u id=“server:client\u id:”+您的web\u应用程序\u client\u id;为我工作。你能解释一下为什么它使用的是web客户端id而不是android吗。它应该和android一起工作,对吗?
String accountName = ...; // Pull from where ever you are storing it
credential.setSelectedAccountName(accountName);
static final String CLIENT_ID = "server:client_id:" + YOUR_WEB_APP_CLIENT_ID;
builder.setApplicationName(getActivity().getPackageName());
credential.setSelectedAccountName(accountName);
service = builder.build();
Core.Info.Category endpoint = service.info().category("en");
String category = endpoint.execute().getDetail();