6

Sposób końcowy wygląda tak:metoda końcowym Google wciąż powraca „Nazwa nie może być pusta” wyjątek

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

Fragment z Android wygląda następująco:

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

Wywołanie reg.execute() utrzymuje rzucanie wyjątek:

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

Z konsoli serwera nawet nie wygląda ike serwer jest trafiony. Nawet gdy próbuję uruchomić serwer w trybie debugowania, mój punkt przerwania (metoda pierwszego wiersza w środku) nie zostanie osiągnięty.

EDIT: dodawanie ślad stosu:

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 

W linii Exception received from server at https://1.myapp.appspot.com/_ah/api/, używam wszystko na localhost. Może https://1.myapp.appspot.com/_ah/api/ jest źle. Mój kod jest bardzo zbliżony do szablonu, więc nie jestem pewien, czy to zmiana, którą popełniłem.

+0

Czy możesz udostępnić pełne śledzenie stosu? Podejrzewam, że błąd występuje w Twoim kodzie Android. –

+0

@DanHolevoet Dodałem ślad stosu. – learner

+0

Ponadto, jestem w stanie trafić serwer poprzez api explorer; ale nie przez kod Androida. – learner

Odpowiedz

1

Możliwe, ale może nazwa, na którą skarży się, że jest nieważna, to nazwa aplikacji?

Do tworzenia usług skończyło się z kodu jak ten

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

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

Należy zauważyć, że dodaje się „setApplicationName” (w odniesieniu do przykładów I znaleziono).

+0

+1 dla długiego strzału. Ale to się nie udało. – learner

6

miał podobny komunikat o błędzie podczas testowania to się dla siebie, co to dla mnie rozwiązany został za pomocą

credential.setSelectedAccountName („[email protected]”);

przed uruchomieniem

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

zakładając podobny kod jest gdzieś w swojej aplikacji. Ponieważ opublikowałeś tylko fragment z wątku dzwoniącego, trudno to stwierdzić.

+0

To mi pomogło! Dzięki! – nhaarman

9

Odtworzona nazwa to nazwa wybranego konta, a nie nazwa aplikacji.

także na Androidzie 6.0 trzeba uzyskać pozwolenieKontakty przed powołać punkty końcowe Google. W przeciwnym razie, nawet jeśli ustawisz nazwę konta, korzystając z

Nadal będziesz otrzymywać wyjątek wspomniany powyżej.

+0

Jak to zrobić dokładnie? –

+0

Dzięki, te informacje "uratowały" moje życie po długim czasie szukając głupich kontaktów Permission !!!!!! Dziękuję Ci – user2582318

0

Dodawanie do odpowiedzi Vikas jest powyżej -

Począwszy od Androida 6.0 (poziom API 23), użytkownicy udzielić uprawnień do aplikacji, gdy aplikacja jest uruchomiona, nie przy instalacji aplikacji.

To zależy od rodzaju pozwolenia, którego szukasz. W przypadku niebezpiecznych uprawnień i grup uprawnień należy poprosić o zezwolenie w czasie wykonywania, a samo określenie go w manifeście nie jest wystarczające.

Aby zobaczyć niebezpiecznych uprawnień i grup - https://developer.android.com/guide/topics/security/permissions.html#perm-groups

Jak widać kontaktów jest jednym z nich -

  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS

Aby rozwiązać ten problem musisz poprosić o pozwolenie w czasie wykonywania. Jak to zrobić? - https://developer.android.com/training/permissions/requesting.html

1

Moje rozwiązanie było użyć

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

Więc użyłem setSelectedAccount zamiast setSelectedAccountName

0

ustawień ACCOUNTNAME nie działa na mnie, musiałem ustawić selectedaccount jak Marco powiedział. Aby uprościć jego odpowiedź:

credential = GoogleAccountCredential.usingOAuth2(context, scopes); 
    credential.setSelectedAccount(new Account("[email protected]", "com.your.pakagename")); 
Powiązane problemy