2016-01-31 77 views
5

我正在使用谷歌日曆API來獲取公共日曆中的事件。 在谷歌開發者控制檯,我創建了一個服務帳戶密鑰(JSON),我在Android代碼中使用設置的GoogleCredential如下:安卓谷歌日曆API在發佈時不工作

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

然後我用這個GoogleCredential獲得日曆對象

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

然後我得到這個日曆

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(); 
012未來5個事件

儘管這段代碼在android studio中運行時可以正常工作,但是當我爲發行版構建(使用keystore文件簽名)時,它不起作用。它只返回以下異常:

com.google.aacbc:404未找到3097-3187/com.news.apoelnews W/System.err的:未找到3097-3187/com.news.apoelnews w^/System.err:
在com.google.aacdacb(來源不明)

請幫幫忙!

UPDATE 我已經加入了採用Android的API密鑰的代碼如下:

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

這將導致以下異常:

W/System.err的: COM .google.api.client.googleapis.json.GoogleJsonResponseException:403 Forbidden W/System.err:「code」:403,W/System.err:「errors」:[/ System.err:「domain」 :「usageLimits」, W/System.err的:
「消息」:「有一個每個IP或每個Referer的限制你的API密鑰配置 和

請注意,請求不符合這些限制的API密鑰是使用調試和版本SHA-1創建的。

+0

由於您使用的服務帳戶,您使用的是工作(谷歌Apps for Work的)日曆? – adjuremods

+0

不,我不................. – Louis

+0

爲什麼要使用服務帳戶?據我所知,如果您使用Google Apps for Work([全域範圍授權委託]](https://developers.google.com/google-apps/calendar/concepts/domain#accessing_domain_calendars_as_an_app),則可以使用服務帳戶)。 – adjuremods

回答

6

問題在發佈是在生成過程中的gradle這個選項「minifyenable真」是搞亂谷歌API類名稱。因此,解決方案包括: -keep class com.google.api。** {*; } in proguard

+0

我有同樣的問題。爲我工作很好。 –

0

先後爲簽名密鑰庫生成的API /密鑰,具有u改變了烏爾項目的API密鑰相匹配的版本密鑰存儲

+0

我已經使用調試和發行版SHA-1創建了一個API密鑰。但正如您在代碼中看到的,我只使用創建服務帳戶密鑰時生成的json文件。我應該在哪裏使用API​​密鑰?如果需要API密鑰,那麼它爲什麼在調試中起作用?謝謝 – Louis

+0

Json使用的是Degug Keystore,下載用於發佈密鑰庫的Json並將其替換到資產文件夾 –

+0

當我創建生成json文件的服務帳戶密鑰時,我沒有指定標識調試的SHA-1或發佈。我在哪裏可以下載發佈密鑰庫的json?使用發行版SHA-1生成的API密鑰不生成json文件 – Louis