読者です 読者をやめる 読者になる 読者になる

Androidに触れてみる(4)【ブラウザ経由で認証してもらうマストドンクライアントを作ってみた】

マストドンへのブラウザ経由の認証及びtootが成功しました。

せっかくですので少しづつ解説してみようと思います。

このアプリはネットにつなぐので当然必要になってきます

intent-filterに関してはよくわかりませんがとりあえずあとから開くものにはactionにVIEWを、categoryにDEFAULTを、ブラウザから開くものにはBROWSABLEをつけておけばよさそうです。

andante.in

またdataはブラウザからデータが送られる場所を設定するタグで、scheme://hostという場所に送らるそうです。利用するときにはそこを参照するようですが、なんでブラウザがそこにデータを送るのかとかなんでそこからデータが取れるのかとかはよくわかりませんでした。知っている人がいたら教えてください。

これは前回も使ったRetrofit2ですね。非同期処理を裏に回したいのでsubscribeOn(~)を使ってます。subscribe()の中身はメインで処理したいのでobserveOnで指定してます。

アプリの名前、リダイレクトURI(AndroidManifest.xmlで設定したshemeとhostをsheme://hostと並べる)、スコープ(read write followをスペース区切りで並べる)をパラメータとして渡してあげるとクライアントを登録できます。ただ、起動するたびに新しいクライアントとして登録するのはかなりまずいのでいつか直さないといけません。成功すると

github.com

 ここに書いてあるものがJSONで送られてきます。今回はGSONを使っている(addConverterFactory(~)の部分)のでクラスのようにデータを扱えます。

この部分でブラウザを起動してます。ブラウザを呼び出すときもパラメーターを渡さないといけませんマストドンOAuth認証にDoorkeeper gem for OAuthなるものを使っているようです。そのため、接続する場所はhost/oauth/authorizeまたはhost/auth/sign_inになるはずです。

github.com

 ブラウザから帰ってくると

こいつが呼ばれます。ここでsetIntentしてあげないとブラウザから送られてきたデータが使えません。ちなみにもらえるデータはcodeと呼ばれるよく理解できていない文字列でsheme://host?code=hogeという形式で送られてきます。onNewIntentの次はそのまま

こいつが呼ばれてきます。ブラウザからもらったcodeを抽出してAccessTokenを入手します。scopeも渡してますが、もしかしたらいらないかもしれません。必要なパラメータと帰ってくるデータについてはここをご参照ください。

github.com

subscribeではもろもろの必要なデータを渡しながら投稿用のアクテビティを起動しています。

tootにはヘッダが必要なのでRetrofitさんに作ってもらうようお願いしています。"toot"の部分につぶやきたい内容を入れればつぶやけるはずです。