Метод конечной точки Google продолжает возвращать исключение "имя не должно быть пустым"

Метод конечной точки выглядит следующим образом:

@Api(
    name = "gameape",
    version = "v1",
    description = "Game App API",
    audiences = { "mynumber.apps.googleusercontent.com" },
    clientIds = { "mynumber.apps.googleusercontent.com", Constant.API_EXPLORER_CLIENT_ID },
    defaultVersion = AnnotationBoolean.TRUE)
public class GameApp {

    private final AccountDao accountDao = new AccountDaoImpl();

    @ApiMethod(name = "LoginUser", path = "LoginUser", httpMethod = HttpMethod.POST)
    public void LoginUser(LoginData request) {
        long phone = request.getPhone();
        String deviceId = request.getDeviceId();
        String gcmToken = request.getGcmToken();
        Account acc = new Account(phone, deviceId, gcmToken);
        accountDao.put(acc);
        ApiHelper.sendGCM(phone, "welcome to my game app");
    }
}

Фрагмент от Android выглядит так:

@Override
protected Boolean doInBackground(Void... params) {
    LoginData request = new LoginData();
    request.setUsername(username);
    request.setPassword(password);

   try {
     RegisterUser reg = service.registerUser(request);
     reg.execute();
     return true;
   } catch (Exception e) {
     Log.e(LoginActivity.class.getName(),
        "Exception received from server at "
         + service.getRootUrl(), e);
   }
   return false;
}

призвание reg.execute() продолжает бросать исключение:

java.lang.IllegalArgumentException: the name must not be empty: null

С консоли сервера это даже не выглядит, как сервер поражен. Даже когда я пытаюсь запустить сервер в режиме отладки, моя точка останова (первая строка внутри метода) не достигается.

РЕДАКТИРОВАТЬ: добавить трассировку стека:

04-03 13:38:42.688: I/com.me.gameapp.LoginActivity$UserLoginTask(11255): Enter doInBackground
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): Exception received from server at https://1.myapp.appspot.com/_ah/api/
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255): java.lang.IllegalArgumentException: the name must not be empty: null
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at android.os.Parcel.readException(Parcel.java:1251)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at android.os.Parcel.readException(Parcel.java:1235)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.android.gms.internal.x$a$a.a(Unknown Source)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:192)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential$RequestHandler.intercept(GoogleAccountCredential.java:217)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:836)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:412)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:345)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:463)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.me.gameapp.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:262)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at com.me.gameapp.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:1)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
04-03 13:38:42.786: E/com.me.gameapp.LoginActivity(11255):  at java.lang.Thread.run(Thread.java:1096)
04-03 13:38:42.786: I/com.me.gameapp.LoginActivity$UserLoginTask(11255): Leave doInBackground with false

В соответствии Exception received from server at https://1.myapp.appspot.com/_ah/api/Я запускаю все на localhost. Может быть https://1.myapp.appspot.com/_ah/api/ неправильно. Мой код очень близок к шаблону, поэтому я не уверен, что это изменение я зафиксировал.

6 ответов

Здесь упоминаемое имя - это имя выбранной учетной записи, а не имя приложения.

Также на Android 6.0 вам необходимо получить разрешение Контакты, прежде чем вызывать конечные точки Google. В противном случае, даже если вы установите имя учетной записи с помощью

credential.setSelectedAccountName(accountName);

Вы все равно получите исключение, упомянутое выше.

Было подобное сообщение об ошибке при тестировании это для себя, что решило это для меня, используя

credential.setSelectedAccountName("user@gmail.com");

перед запуском

SomeAbstractGoogleJsonClient.Builder builder = new SomeAbstractGoogleJsonClient.Builder(
AndroidHttp.newCompatibleTransport(), new GsonFactory(), credential);

предполагая, что подобный код находится где-то в вашем приложении. Поскольку вы только что опубликовали фрагмент из своей ветки вызывающих абонентов, это довольно сложно сказать.

Мое решение было использовать

credential.setSelectedAccount(new Account(settings.getString(Constants.PREF_ACCOUNT_NAME, null), "com.example.myapplication"));

Так что я использовал setSelectedAccount вместо setSelectedAccountName

Настройка имени учетной записи не работает для меня, я должен был установить выбранную учетную запись, как сказал Марко. Чтобы упростить его ответ

   credential = GoogleAccountCredential.usingOAuth2(context, scopes);
    credential.setSelectedAccount(new Account("developer@gmail.com", "com.your.pakagename"));

Возможно, это длинный список, но, может быть, имя приложения, на которое жалуются, что оно пустое, - это имя приложения?

Для создания сервиса я получил такой код

HttpTransport transport = AndroidHttp.newCompatibleTransport();
JsonFactory jsonFactory = new JacksonFactory();

Nviewendpoint.Builder builder = new Nviewendpoint.Builder( transport, jsonFactory, null );  
builder.setApplicationName( appName );

Обратите внимание, что я добавил 'setApplicationName' (относительно примеров, которые я нашел).

Добавление к ответу Викаса выше -

Начиная с Android 6.0 (уровень API 23), пользователи предоставляют разрешения приложениям во время работы приложения, а не при установке приложения.

Это на самом деле зависит от типа разрешения, которое вы ищете. Для Опасных разрешений и групп разрешений вам нужно запрашивать разрешение во время выполнения, и просто указать его в манифесте недостаточно.

Чтобы увидеть опасные разрешения и группы - https://developer.android.com/guide/topics/security/permissions.html

Как вы можете видеть КОНТАКТЫ является одним из них -

  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS

Чтобы это исправить, вам нужно запросить разрешение во время выполнения. Как это сделать? - https://developer.android.com/training/permissions/requesting.html

Другие вопросы по тегам