Gmail Api 的解读及例子
生活随笔
收集整理的這篇文章主要介紹了
Gmail Api 的解读及例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 由于公司需求需要獲取Gmail的信息,于是下了Google提供的例子并開始研究GoogleApi的調用,在這個過程中遇到了幾個坑同時也學習到了一些知識,現記錄如下:
? ????一 Android QuickStart
? ? ? ??https://developers.google.com/gmail/api/quickstart/android? ?(鏈接)
? ? ? ? google 給出了一個對于Andriod 的快速開始的例子,沒有現成的源碼,但是文章比較詳細的介紹了要想在Android上使用gmailApi,需要做的步驟。像任何第三方提供接口一樣,你需要相關授權并在其網站上建立該應用(博主也使用過新浪提供的api ,那個坑真是淚淚的。。)。
? ? ? ? step1 中需要Android 的sha1 的簽名證書,keytool是jdk的工具,要將其路徑加入環境變量中,對我坑的是,文檔上 debug.keystore 的地址,由于我的jdk 是安裝再d盤的,所以 文檔上的 ~ 代表的是D盤,而debug.keystore 是存在在你C 盤下的,所以各種找不到,最后突然頓悟Linux下的命令的相對地址,才發現了這個坑,得到了sha1的簽名證書。
? ? ??? ?
Linux路徑,對相對路徑要敏感!
? ? ? ? ?
? ? ? ? 接下來按照步驟來進行,順利在AS上建立了工程,不過下載相關的依賴也是費了好大勁,結果jar 包下下來之后,開始run,出現錯誤:
? ? ? ? com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_45\bin\java.exe'' finished with non-zero exit value 2
? ? ? ? 上網各種找解決方法,http://stackoverflow.com/questions/30001051/appdexdebug-execexception-finished-with-non-zero-exit-value-2? ?stackoverflow上的這個解釋地很好。就是jar 包的問題。 ? ? ? 用網上的方法去逐個刪除jar 包排除這種重復,但是最恐怖的事情發生了,當刪除一個jar包的時候重復錯誤沒有了,但是同時代碼里的不識別也出來了,這說明一個jar包里面的是一半需要一半不需要! 仔細的比對了文檔提供的build.gradle 文件,想到在建立 build.gradle 文件的時候,直接生成的默認的 compileSdkVersion和 targetSdkVersion ?等 是 23 ,而例子提供的是22,導致下面 dependencies中 compile 的 包名里面 ?appcompat-v7:23.0.0 ,和文檔給出的不符合,然后添加dependencies 中的其他 依賴,一般都用高版本的,所以想可能是這個原因,將所有數字改成和文檔提供的一樣,然后,然后。。。就build成功了。。。。 ? ? ?? ?版本的問題有時候很重要,這是對所有開發的坑,特別是jar包,sdk的版本等,時刻擁抱變化。。。
? ? ?二 具體API ??? ?quickstart 只是給出了獲得當前gmail賬戶所有標簽的例子,誰想要標簽啊,當然都是要未讀郵件的數目啦,開始理解Gmail的數據結構,下面進行簡單的介紹,并不詳盡,因為沒有太多時間去一一理解: ? ? ?Gmail提供了三種數據結構:Threads,Messages,Labels。Threads 在我理解是會話的一次,是指你和另外的一個賬戶進行會話的過程,而每一個Threads 是可以有多個Messages的,所以Messages就很好理解,就是指一條信息,通過查看它的屬性和操作,你可以知道當獲得了這個對象之后你可以獲得的相關信息和進行的操作;而labels就是你郵箱中定義的標簽,從給出的quicstart也可以看出,最后打印出來的有INBOX,SPAM,SENT等各種類型,可以從這個鏈接上查看https://developers.google.com/gmail/api/guides/labels,更開心的是,看到了User.lables是具有messagesTotal,messagesUnread,threadsTotal,threadsUnread 的屬性,那么獲得你想要的標簽下的對象,然后輸出這個屬性不就好了,我們想要未讀郵箱的數目,那么就是INBOX里面的threadsUnread的屬性嘛,很開心的在QuickStart 的程序中對獲得的lables進行遍歷, 搜集INBOX標簽的對象,結果打印的結果是null,試了各種標簽的數目都是null,百思不得其解,這個時候一定要再去看google文檔,又耐心的找了一遍,發現在具體的介紹操作(get,list,modify,delete等)的頁面上有代碼段子,并且提供了頁面操作,然后發現了獲取label的方法有貓膩,QuickStart上僅僅是mActivity.mService.users().labels.list(user).execute(), ?只是獲得了label的list,而實際上是這樣子的: MActivity.mService.users().labels.get(user,"INBOX").execute() ,這樣獲得的label對象才能夠獲得到threadsUnread的數值,果然還是做得看得少了。 ? ? ? ?同時還要注意的是,對Gmail郵箱不同類型的操作是需要不同的權限的,只是獲得labellist,權限少,但是要獲得數目或者是要對具體信息更改創建的時候需要更多的權限,以QuickStart為例,其權限設置在SCOPES一個字符串數組里,你可以向其中添加GmailScopes.GMAIL_LABELS,GmailScope.MAIL_GOOGLE_COM等權限。 ? ? ? ? ? 三 Android知識??
? ? ? ? 在復制QuickStart代碼的過程中,學習了一下google技術人員的寫法,可能只有兩個文件,不能顯示出google技術人員的水平,一個mainactivity ,動態寫的布局,沒有用layout的xml文件,使用了AsynTask來做異步操作,但是驚奇的是在doInbackgroud中進行了UI的操作,但是人家這個UI操作是封裝在acitivty中runOnUIThread里面的,看得我也是愣神一愣神的,想必自己經歷的還是太少,對于runOnUIThread這個函數,網上有其和handler的使用場景比較,但實際上runOnUiThread的源碼即使用了handler 的callbacks 進行完成的,只不過用runOnUithread應該代碼量更少而已,所以可能到底用哪個全看喜好了,但關鍵還是要理解其內部的原理,才能隨心所欲。
? ? ? ?記錄動態生成布局的例子,有利于理解Android的View其繪制原理:
LinearLayout activityLayout = new LinearLayout(this);
? ? ? ? LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
? ? ? ? ? ? ? ? LinearLayout.LayoutParams.MATCH_PARENT,
? ? ? ? ? ? ? ? LinearLayout.LayoutParams.MATCH_PARENT);
? ? ? ? activityLayout.setLayoutParams(lp);
? ? ? ? activityLayout.setOrientation(LinearLayout.VERTICAL);
? ? ? ? activityLayout.setPadding(16, 16, 16, 16);
? ? ? ? ViewGroup.LayoutParams tlp = new ViewGroup.LayoutParams(
? ? ? ? ? ? ? ? ViewGroup.LayoutParams.WRAP_CONTENT,
? ? ? ? ? ? ? ? ViewGroup.LayoutParams.WRAP_CONTENT);
? ? ? ? mOutputText = new TextView(this);
? ? ? ? mOutputText.setLayoutParams(tlp);
? ? ? ? mOutputText.setPadding(16, 16, 16, 16);
? ? ? ? mOutputText.setVerticalScrollBarEnabled(true);
? ? ? ? mOutputText.setMovementMethod(new ScrollingMovementMethod());
? ? ? ? activityLayout.addView(mOutputText);
下面給出了自己寫的quickstart的源代碼,是成型的工程,輸出結果為全部郵箱數目和未讀郵箱數目,同時加入了一分鐘刷新頁面的機制<使用的是handler> PS: Gmal Api部分還有推送部分,還沒有時間詳細的去了解,想必這個推送對一些app有價值,可以后續有時間了再研究。 下載鏈接:http://download.csdn.net/detail/elfxwt/9178015 github地址: ? ?https://github.com/elfxwt/GmailQuickStart/tree/master ??
? ? ? ? 上網各種找解決方法,http://stackoverflow.com/questions/30001051/appdexdebug-execexception-finished-with-non-zero-exit-value-2? ?stackoverflow上的這個解釋地很好。就是jar 包的問題。 ? ? ? 用網上的方法去逐個刪除jar 包排除這種重復,但是最恐怖的事情發生了,當刪除一個jar包的時候重復錯誤沒有了,但是同時代碼里的不識別也出來了,這說明一個jar包里面的是一半需要一半不需要! 仔細的比對了文檔提供的build.gradle 文件,想到在建立 build.gradle 文件的時候,直接生成的默認的 compileSdkVersion和 targetSdkVersion ?等 是 23 ,而例子提供的是22,導致下面 dependencies中 compile 的 包名里面 ?appcompat-v7:23.0.0 ,和文檔給出的不符合,然后添加dependencies 中的其他 依賴,一般都用高版本的,所以想可能是這個原因,將所有數字改成和文檔提供的一樣,然后,然后。。。就build成功了。。。。 ? ? ?? ?版本的問題有時候很重要,這是對所有開發的坑,特別是jar包,sdk的版本等,時刻擁抱變化。。。
? ? ?二 具體API ??? ?quickstart 只是給出了獲得當前gmail賬戶所有標簽的例子,誰想要標簽啊,當然都是要未讀郵件的數目啦,開始理解Gmail的數據結構,下面進行簡單的介紹,并不詳盡,因為沒有太多時間去一一理解: ? ? ?Gmail提供了三種數據結構:Threads,Messages,Labels。Threads 在我理解是會話的一次,是指你和另外的一個賬戶進行會話的過程,而每一個Threads 是可以有多個Messages的,所以Messages就很好理解,就是指一條信息,通過查看它的屬性和操作,你可以知道當獲得了這個對象之后你可以獲得的相關信息和進行的操作;而labels就是你郵箱中定義的標簽,從給出的quicstart也可以看出,最后打印出來的有INBOX,SPAM,SENT等各種類型,可以從這個鏈接上查看https://developers.google.com/gmail/api/guides/labels,更開心的是,看到了User.lables是具有messagesTotal,messagesUnread,threadsTotal,threadsUnread 的屬性,那么獲得你想要的標簽下的對象,然后輸出這個屬性不就好了,我們想要未讀郵箱的數目,那么就是INBOX里面的threadsUnread的屬性嘛,很開心的在QuickStart 的程序中對獲得的lables進行遍歷, 搜集INBOX標簽的對象,結果打印的結果是null,試了各種標簽的數目都是null,百思不得其解,這個時候一定要再去看google文檔,又耐心的找了一遍,發現在具體的介紹操作(get,list,modify,delete等)的頁面上有代碼段子,并且提供了頁面操作,然后發現了獲取label的方法有貓膩,QuickStart上僅僅是mActivity.mService.users().labels.list(user).execute(), ?只是獲得了label的list,而實際上是這樣子的: MActivity.mService.users().labels.get(user,"INBOX").execute() ,這樣獲得的label對象才能夠獲得到threadsUnread的數值,果然還是做得看得少了。 ? ? ? ?同時還要注意的是,對Gmail郵箱不同類型的操作是需要不同的權限的,只是獲得labellist,權限少,但是要獲得數目或者是要對具體信息更改創建的時候需要更多的權限,以QuickStart為例,其權限設置在SCOPES一個字符串數組里,你可以向其中添加GmailScopes.GMAIL_LABELS,GmailScope.MAIL_GOOGLE_COM等權限。 ? ? ? ? ? 三 Android知識??
? ? ? ? 在復制QuickStart代碼的過程中,學習了一下google技術人員的寫法,可能只有兩個文件,不能顯示出google技術人員的水平,一個mainactivity ,動態寫的布局,沒有用layout的xml文件,使用了AsynTask來做異步操作,但是驚奇的是在doInbackgroud中進行了UI的操作,但是人家這個UI操作是封裝在acitivty中runOnUIThread里面的,看得我也是愣神一愣神的,想必自己經歷的還是太少,對于runOnUIThread這個函數,網上有其和handler的使用場景比較,但實際上runOnUiThread的源碼即使用了handler 的callbacks 進行完成的,只不過用runOnUithread應該代碼量更少而已,所以可能到底用哪個全看喜好了,但關鍵還是要理解其內部的原理,才能隨心所欲。
? ? ? ?記錄動態生成布局的例子,有利于理解Android的View其繪制原理:
LinearLayout activityLayout = new LinearLayout(this);
? ? ? ? LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
? ? ? ? ? ? ? ? LinearLayout.LayoutParams.MATCH_PARENT,
? ? ? ? ? ? ? ? LinearLayout.LayoutParams.MATCH_PARENT);
? ? ? ? activityLayout.setLayoutParams(lp);
? ? ? ? activityLayout.setOrientation(LinearLayout.VERTICAL);
? ? ? ? activityLayout.setPadding(16, 16, 16, 16);
? ? ? ? ViewGroup.LayoutParams tlp = new ViewGroup.LayoutParams(
? ? ? ? ? ? ? ? ViewGroup.LayoutParams.WRAP_CONTENT,
? ? ? ? ? ? ? ? ViewGroup.LayoutParams.WRAP_CONTENT);
? ? ? ? mOutputText = new TextView(this);
? ? ? ? mOutputText.setLayoutParams(tlp);
? ? ? ? mOutputText.setPadding(16, 16, 16, 16);
? ? ? ? mOutputText.setVerticalScrollBarEnabled(true);
? ? ? ? mOutputText.setMovementMethod(new ScrollingMovementMethod());
? ? ? ? activityLayout.addView(mOutputText);
下面給出了自己寫的quickstart的源代碼,是成型的工程,輸出結果為全部郵箱數目和未讀郵箱數目,同時加入了一分鐘刷新頁面的機制<使用的是handler> PS: Gmal Api部分還有推送部分,還沒有時間詳細的去了解,想必這個推送對一些app有價值,可以后續有時間了再研究。 下載鏈接:http://download.csdn.net/detail/elfxwt/9178015 github地址: ? ?https://github.com/elfxwt/GmailQuickStart/tree/master ??
總結
以上是生活随笔為你收集整理的Gmail Api 的解读及例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java事件处理 java.awt.ev
- 下一篇: 第一届天池 PolarDB 数据库性能大