Send Message by Gmail,
Twitter Kit Android
Abstract#
Gmailを
Androidから送ろうとして、結構苦労したので記録します。2018年8月30日でやっとできた。これだけで2週間費やしたかも。
Topic#
Oauth of Firebase#
at first I will try to implement Oauth of Google by using Firebase. |
どうしてもconnect failed: ECONNREFUSED (Connection refused)が出て進まない。。。 |
com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.gmail.com, 465; timeout -1;
nested exception is:
java.net.ConnectException: failed to connect to smtp.gmail.com/2404:6800:4008:c01::6c (port 465) from /:: (port 54402): connect failed: ECONNREFUSED (Connection refused)
パスワードも設定した。いくつかの例も実装したが、かわらない。 |
Google側の設定があるのか?2段階認証にしないといけないの?安全性の低いアプリの許可を一時的に有効にしても変わらない。 |
TLSの方がいいのか。そうしてみたけど変わらん。 |
OAuthでGoogleにログインした後だったら変わるか?変わらない。。。 |
Based on Java base sample#
Error: Program type already present: com.google.common.annotations.Beta
Error: Program type already present: com.google.common.annotations.GwtCompatible
Cannot fit requested classes in a single dex file. Try supplying a main-dex list.
を参考に以下の設定をgradleに追加するとコンパイルは通るようになるが。。。 |
defaultConfig {
...
multiDexEnabled true
...
dependencies {
...
implementation('com.google.api-client:google-api-client:1.23.0') {
exclude module: 'guava-jdk5'
}
implementation ('com.google.apis:google-api-services-gmail:v1-rev83-1.23.0'){
exclude module: 'guava-jdk5'
}
...
implementation 'com.android.support:multidex:1.0.3'
今度は以下のようなエラーが発生。androidはJKSに対応していない?BKSを使いなさい? |
W/System.err: java.security.KeyStoreException: JKS not found
at java.security.KeyStore.getInstance(KeyStore.java:890)
at com.google.api.client.util.SecurityUtils.getJavaKeyStore(SecurityUtils.java:53)
at com.google.api.client.googleapis.GoogleUtils.getCertificateTrustStore(GoogleUtils.java:74)
W/System.err: at com.google.api.client.googleapis.javanet.GoogleNetHttpTransport.newTrustedTransport(GoogleNetHttpTransport.java:55)
代わりに下記のメソッドで代用してみる. なんか進んだ気がする。 |
HTTP_TRANSPORT = new com.google.api.client.http.javanet.NetHttpTransport();
その後、設定フォルダや一時保存フォルダあたりを整理しつつ、実装を進めたが、Oauth周りで、Javaのコンソールアプリケーションでできたことができない。com.google.api.services.gmail.Gmailオブジェクトさえうまく作れれば。。。やはりサーバ側で送るようにしたほうがいいのか。。。もう一度、今の知識をもとに、FirebaseのAuth機能を使うことも考えられるが、GMAIL APIにSCOPEインプットしてとかできるのか。なんとなく想定されていない気がする。 |
Gmail.Builder#
Gmail.BuilderのAPIのJavadocをみていると、Androidで使うべきライブラリが違う気がしてきた。 |
com.google.api.client.googleapis.javanet.GoogleNetHttpTransport#newTrustedTransport()ではなく、com.google.api.client.extensions.android.http.AndroidHttp#newCompatibleTransport()など |
JacksonFactoryをAndroidJsonFactoryとか |
AuthorizationCodeInstalledApp.authorize()でどうもjava.awt.Desktopを探している。これはAndroidで使うクラスじゃないと思っている。GoogleAuthorizationCodeFlowがブラウザ立ち上げて認証とかしているので、そのままでは、Androidに適用できない。 |
AccountManager#
AndroidでつかうOauthをまとめている情報発見.ここから呼ばれているGithub上のコードをみつつ進めてみよう。このうちAndroidのAccountManagerを使うやり方に注目してみる。でいうパターン5。Gmailオブジェクトをつくるところまでローカルで実施して、UserRecoverableAuthIOExceptionを受け取ってからOauth認証を実施するやり方と理解。しかしこのExceptionを出す前に以下のエラーが出て行き詰まる。 |
Rejecting re-init on previously-failed class java.lang.Class<javax.activation.DataHandler>: java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/datatransfer/Transferable;
implementation 'com.sun.mail:android-mail:1.6.0'
implementation 'com.sun.mail:android-activation:1.6.0'
を追加する。javax.mail:mail:1.4.7'とか呼んでたら、消しておく。 |
そういえばこのアプローチで、credentials.jsonのような接続先を指定するのはどこだろう。OAuth03でもどこかで指定している。どこだ?Activityができるときのはず。Credentialを作るときはもうActivityがプロジェクトのURLを持っていた。それがkurukurupapaだからエラーが出る。わからない。 |
エラーが起こるMimeMessageはAndroid用じゃない?もしくはコントラクタで指定しているSessionか。そこででてくるauthenticatorがあやしくないか。うーん、いまいちGoogle先生の切れが悪い。=検索の仕方の問題か |
Tokenをうんぬんというのを整理したほうがいいかもしれない。 |
2018年8月30日、やったーできた。depencencyの問題だった。他はエラーメッセージで対応可能だった。GMAIL APIの有効化とか。 |
Reference#
- zuccyi、2015年11月、Android Gmailアカウントでメールを送信する, https://qiita.com/zuccyi/items/9757ad0308d784a09c35
- StackOverflow, 2018年1月, https://stackoverflow.com/questions/48249633/errorcannot-fit-requested-classes-in-a-single-dex-file-try-supplying-a-main-dex, https://stackoverflow.com/questions/48249633/errorcannot-fit-requested-classes-in-a-single-dex-file-try-supplying-a-main-dex
- さとう, 2013年5月, Re: 「android-group-japan: 22938」 「質問」GoogleDriveのOAuth2認証に失敗する件について, https://groups.google.com/forum/#!topic/android-group-japan/2GLn3PVBVkY
- StackOverFlow, 2016年8月31日, GoogleNetHttpTransport.newTrustedTransport() returning Null, https://stackoverflow.com/questions/39248453/googlenethttptransport-newtrustedtransport-returning-null
- @kurukurupapa@github, 2014年11月21日, AndroidでOAuth認証をしたい, https://qiita.com/kurukurupapa@github/items/fee066909294e177026a