6

Il metodo endpoint assomiglia a questo:metodo endpoint Google continua a tornare "nome non deve essere vuoto" eccezione

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

Il frammento da sguardi Android come questo:

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

Calling reg.execute() mantiene gettando il eccezione:

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

dalla console del server, non sembra neanche l ike viene colpito il server. Anche quando provo a eseguire il server in modalità di debug, non viene raggiunto il punto di interruzione (metodo interno prima riga).

EDIT: aggiunta di analisi dello stack:

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 

Nella linea Exception received from server at https://1.myapp.appspot.com/_ah/api/, Sono in esecuzione tutto su localhost. Forse https://1.myapp.appspot.com/_ah/api/ è sbagliato. Il mio codice è molto vicino al modello, quindi, quindi non sono sicuro che sia un cambiamento che ho commesso.

+0

Puoi condividere la traccia dello stack completo? Sospetto che l'errore sia nel tuo codice Android. –

+0

@DanHolevoet Ho aggiunto la traccia dello stack. – learner

+0

Inoltre, sono in grado di colpire il server attraverso l'API explorer; ma non attraverso il codice Android. – learner

risposta

1

Un longshot forse, ma forse il 'nome' che si lamenta di essere nullo è il nome dell'applicazione?

Per creare il servizio che ho finito con codice come questo

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

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

Si noti che ho aggiunto il 'setApplicationName' (rispetto agli esempi che ho trovato).

+0

+1 per il tiro lungo. Ma quello non l'ha fatto. – learner

6

aveva un messaggio di errore simile quando si verifica questo per me stesso, quello che ha risolto per me stava usando

credential.setSelectedAccountName ("[email protected]");

prima di eseguire

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

assumendo codice simile è da qualche parte nella tua app. Come hai appena postato lo snippet dal thread del chiamante, è piuttosto difficile da dire.

+0

Questo mi ha aiutato! Grazie! – nhaarman

9

Qui il nome è il nome dell'account selezionato, non il nome dell'applicazione.

anche su Android 6.0 è necessario per ottenere i Contatti permesso prima di richiamare gli endpoint google. In caso contrario, anche se si imposta il nome account utilizzando

credential.setSelectedAccountName(accountName); 

Sarà ancora ottenere l'eccezione di cui sopra.

+0

E come si fa esattamente? –

+0

Grazie, questa informazione mi ha "salvato" la vita dopo un sacco di tempo cercando gli stupidi Contatti Autorizzazione !!!!!! grazie – user2582318

0

aggiunta alla risposta di Vikas sopra -

A partire dal Android 6.0 (API di livello 23), gli utenti concedere autorizzazioni per le applicazioni mentre l'applicazione è in esecuzione, non quando si installa l'applicazione.

In realtà dipende dal tipo di permesso che si sta cercando. Per le autorizzazioni e i gruppi di permessi pericolosi è necessario chiedere il permesso in fase di runtime e non è sufficiente specificarlo in manifest.

Per vedere i permessi e gruppi pericolosi - https://developer.android.com/guide/topics/security/permissions.html#perm-groups

Come si può vedere CONTATTI è uno di loro -

  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS

per risolvere questo problema è necessario chiedere il permesso in fase di runtime. Come farlo? - https://developer.android.com/training/permissions/requesting.html

1

La mia soluzione era quella di utilizzare

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

quindi ho usato setSelectedAccount invece di setSelectedAccountName

0

Impostazione accountname non ha funzionato per me, ho dovuto impostare selectedAccount come ha detto Marco. Per semplificare la sua risposta

credential = GoogleAccountCredential.usingOAuth2(context, scopes); 
    credential.setSelectedAccount(new Account("[email protected]", "com.your.pakagename")); 
Problemi correlati