2016-01-31 14 views
5

używam api google calendar, aby uzyskać wydarzenia z kalendarza publicznego. W konsoli programisty Google I stworzyliśmy klucz konta usługi (json), który używam do Setup GoogleCredential w android kod w następujący sposób:api google kalendarz Google nie działa, gdy w wersji

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

Następnie Używam tego GoogleCredential aby uzyskać obiekt kalendarza

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

Potem dostać następne 5 zdarzeń z tego kalendarza

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(); 

Chociaż ten kod działa poprawnie podczas debugowania podczas pracy w Androidzie studio, kiedy kompiluję do wydania (podpis z plikiem magazynu kluczy), to nie działa. To po prostu zwraca następujący wyjątek:

com.google.aacbc: 404 Not Found 3097-3187/com.news.apoelnews W/System.err: Nie znaleziono 3097-3187/com.news.apoelnews W. /System.err:
na com.google.aacdacb (Unknown Source)

Proszę o pomoc!

UPDATE I dodano zastosowanie android klucza API w kodu w następujący sposób:

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(); 

To powoduje następujące wyjątki:

W/System.err: com .google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden W/System.err: "code": 403, W/System.err: "errors": [{ W/System.err: "domain" : "usageLimits", W/System.err:
"message" : „Istnieje ograniczenie per-IP lub per-Referer skonfigurowany na klucz API i żądanie nie pasuje do tych ograniczeń

Należy pamiętać, że klucze API są tworzone przy użyciu debugowania i wydania SHA-1.

+0

Ponieważ używasz Konta serwisowe, używasz kalendarz do pracy (Google Apps for Work)? – adjuremods

+0

Nie, ja nie .......................... – Louis

+0

Dlaczego warto korzystać z kont usług? Z tego co wiem, możesz używać kont usług, jeśli używasz Google Apps for Work ([delegowanie uprawnień do całej domeny] (https://developers.google.com/google-apps/calendar/concepts/domain#accessing_domain_calendars_as_an_app)). – adjuremods

Odpowiedz

6

problem był w trakcie budowy w wydaniu opcja Gradle „minifyenable prawdą” było ingerować w nazwy klas aplikacji Google. Rozwiązaniem jest więc: -keep class com.google.api. ** {*; } w PROGUARD

+0

Miałem ten sam problem. Sprawdziło się dla mnie. –

0

Posiada API/klucz wygenerowany dla podpisanego Keystore i mają u zmienił klucz API w ur projekt, który pasuje do zwalniania Keystore

+0

Utworzono klucz API z debugowaniem i wydaniem SHA-1. Ale jak widać w kodzie, używam tylko pliku json wygenerowanego podczas tworzenia klucza konta usługi. Gdzie powinienem użyć klucza API? A jeśli klucz API jest potrzebny, to dlaczego działa w debugowaniu? Dziękuję – Louis

+0

Użycie Json ur jest z Degug Keystore, Pobierz Json dla magazynu kluczy wydania i zastąp go w folderze zasobów –

+0

Kiedy tworzę klucz konta usługi, który generuje plik json, nie określam SHA-1, który identyfikuje debugowanie lub zwolnij. Gdzie mogę pobrać plik json dla magazynu kluczy wydania? Klucze API wygenerowane przy wydaniu SHA-1 nie produkują pliku json – Louis

Powiązane problemy