无法使用我的服务对象连接到我的Google端点 [英] unable to connect to my google endpoints with my service object

查看:102
本文介绍了无法使用我的服务对象连接到我的Google端点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经从端点生成了我的客户端库,并且还为我对端点的身份验证调用传递了适当的凭据(客户端ID为100%正确).

I have generated my client library from my endpoints, and also passed the appropriate credential (the client ID is 100% correct) for my authenticated call to the endpoints.

但是我运行代码时仍然出现此错误:

But I am still getting this error when I run my codes:

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);
       }
   }

我刚刚编辑了下面的答案的代码,但仍然收到此错误

I just edited the code to answers below but am still getting this errors

这是帐户选择器"的代码:

This is the code for the Account picker:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case REQUEST_ACCOUNT_PICKER:
                if (data != null && data.getExtras() != null) {
                    String accountName =
                            data.getExtras().getString(
                                    AccountManager.KEY_ACCOUNT_NAME);
                    if (accountName != null) {
                        setSelectedAccountName(accountName);
                        SharedPreferences.Editor editor = settings.edit();
                        editor.putString(PREF_ACCOUNT_NAME, accountName);
                        editor.commit();
                        // User is authorized.
                    }
                }
                break;
        }
    }

这是setSelectedAccountName方法

this is the setSelectedAccountName method

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()之前,您需要在构建器中设置应用程序包名称:

You need to set the application package name in the builder before calling .build():

builder.setApplicationName(getActivity().getPackageName());

此外,如果这是通过身份验证的呼叫,则您将不得不使用户通过帐户选择器来选择Google帐户,并在凭据中进行设置:

Also, if this is an authenticated call, you will have had to run the user through the account picker to select a Google account and also set that in the credentials:

String accountName = ...;  //  Pull from where ever you are storing it
credential.setSelectedAccountName(accountName);

此外,从提供的代码来看,CLIENT_ID对于受众(范围)的含义并不明显,因此请确保其格式为:

Also, it's not obvious from the provided code what CLIENT_ID is for the audience (scope), so make sure it is in the format:

static final String CLIENT_ID = "server:client_id:" + YOUR_WEB_APP_CLIENT_ID;

由于您正在使用云端点的生成的库,因此不必设置根URL或使用原始HTTP请求/响应.端点生成的库已经在为您执行HTTP请求准备和HTTP响应JSON解析.在没有看到您的云API的情况下,我在这里猜测您的类别"的云方法返回的模型为Category,该模型具有一个成员字段detail,可以使用getter getDetail()检索该成员字段:

Since you are using cloud endpoint's generated library, you do not have to set the root URL or use the raw HTTP request/response. The endpoint generated library is already doing the HTTP request prep and HTTP response JSON parsing for you. Without seeing your cloud API, I'm guessing here that your cloud method for "category" returns something modeled as Category which has a member field detail which can be retrieved with the getter getDetail():

builder.setApplicationName(getActivity().getPackageName());
credential.setSelectedAccountName(accountName);
service = builder.build();
Core.Info.Category endpoint = service.info().category("en");
String category = endpoint.execute().getDetail();

这篇关于无法使用我的服务对象连接到我的Google端点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆