2016-01-31 18 views
5

Sto usando google calendar api per ottenere eventi da un calendario pubblico. Nella console sviluppatore di Google Ho creato una chiave di account di servizio (JSON), che io uso per impostare il GoogleCredential nel codice Android come segue:android google calendar api non funziona quando in versione

AssetManager am = getAssets(); 
InputStream inputStream = am.open("key-file-name.json"); 

GoogleCredential credential = GoogleCredential.fromStream(inputStream); 

credential =credential.createScoped(Arrays.asList("https://www.googleapis.com/auth/calendar.readonly")); 

allora io uso questo GoogleCredential per ottenere l'oggetto calendario

Calendar client = new Calendar.Builder(AndroidHttp.newCompatibleTransport(), 
        new JacksonFactory(), 
        credential).setApplicationName("someAppName").build(); 

Poi ho ottenere il prossimo 5 eventi da questo calendario

com.google.api.services.calendar.model.Events nextEvent = 
          client.events().list("[email protected]") 
            .setTimeMin(new DateTime(new java.util.Date(), java.util.TimeZone.getDefault())) 
            .setMaxResults(5) 
            .setOrderBy("startTime") 
            .setSingleEvents(true) 
            .setShowDeleted(false) 
            .execute(); 

Sebbene questo codice funzioni correttamente nel debug durante l'esecuzione in Android Studio, quando eseguo il build per la versione (firmare con il file keystore) non funziona. E 'appena restituisce il seguente eccezione:

com.google.aacbc: 404 Not Found 3097-3187/com.news.apoelnews W/System.err: Not Found 3097-3187/com.news.apoelnews W /System.err:
a com.google.aacdacb (Fonte sconosciuta)

Please help!

UPDATE ho aggiunto l'uso della chiave API Android nel codice come segue:

com.google.api.services.calendar.model.Events nextEvent = 
client.events().list("[email protected]") 
.setTimeMin(new DateTime(new java.util.Date(), java.util.TimeZone.getDefault())) 
.setMaxResults(5) 
.setOrderBy("startTime") 
.setSingleEvents(true) 
.setShowDeleted(false) 
.setKey("api-key-string_from_developer_console")) 
.execute(); 

Ciò causa l'eccezione seguente:

W/System.err: com .google.api.client.googleapis.json.GoogleJsonResponseException: 403 Pro proibito W/System.err: "codice": 403, W/System.err: "errori": [{ W/System.err: "dominio" : "usageLimits", W/System.err:
"messaggio": "C'è una limitazione per-IP o per-Referer configurato sulla vostra chiave API e la richiesta non corrisponde a queste restrizioni

Si prega di notare che le chiavi API vengono creati utilizzando il debug e la versione SHA-1.

+0

Dal momento che si sta utilizzando account di servizio, stai usando Calendario per il lavoro (Google Apps for Work)? – adjuremods

+0

No I .......................... – Louis

+0

Perché utilizzare gli account di servizio? Da quello che so, puoi utilizzare gli account di servizio se utilizzi Google Apps for Work ([delegazione di autorità a livello di dominio] (https://developers.google.com/google-apps/calendar/concepts/domain#accessing_domain_calendars_as_an_app)). – adjuremods

risposta

6

Il problema era durante la costruzione nel rilascio l'opzione Gradle 'minifyenable vero' era scherzi con i nomi delle classi di API di Google. Quindi la soluzione è includere: -keep class com.google.api. ** {*; } nella proguard

+0

ho avuto lo stesso problema. Ha funzionato bene per me. –

0

Ha l'API/chiave generata per il Keystore Firmato, e hanno u cambiato la chiave api in ur progetto che corrisponde al tuo Keystore rilascio

+0

Ho creato una chiave API con il debug e rilascio SHA-1. Ma come puoi vedere nel codice, utilizzo solo il file JSON generato durante la creazione della chiave dell'account di servizio. Dove dovrei usare la chiave API? E se è necessaria la chiave API, perché funziona nel debug? Grazie – Louis

+0

L'utente Json che usa è Degug Keystore, scarica Json per il keystore di rilascio e lo sostituisce nella cartella delle risorse –

+0

Quando creo la chiave dell'account di servizio che genera il file json, non specifica SHA-1 che identifica il debug o rilascio. Dove posso scaricare JSON per il rilascio del keystore? Le chiavi API generate con la release SHA-1 non producono un file json – Louis