Метод конечной точки 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"); } } 

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

 @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 

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

EDIT: добавление трассировки стека:

 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$aa(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/ не так. Однако мой код очень близок к шаблону, поэтому я не уверен, что это изменение, которое я совершил.

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

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

Также на Android-версии 6.0 вам нужно получить разрешение «Контакты», прежде чем вы будете ссылаться на конечные точки google. В противном случае, даже если вы укажете имя учетной записи, используя

 credential.setSelectedAccountName(accountName); 

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

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

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

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

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

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

Возможно, длинный, но, возможно, «имя», в котором он жалуется, что это null, – это имя приложения?

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

 HttpTransport transport = AndroidHttp.newCompatibleTransport(); JsonFactory jsonFactory = new JacksonFactory(); Nviewendpoint.Builder builder = new Nviewendpoint.Builder( transport, jsonFactory, null ); builder.setApplicationName( appName ); 

Обратите внимание, что я добавил «setApplicationName» (относительно найденных мной примеров).

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

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

Поэтому я использовал setSelectedAccount вместо setSelectedAccountName

Добавив к ответу Викаса выше –

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

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

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

Как вы можете видеть, КОНТАКТЫ – один из них –

  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS

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

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

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