Retrofit 2.0-beta で ログを吐かせる

Retrofit

Okhttp 2.6.0+ では HTTPリクエスト/レスポンスのログ出力が可能なのだが,

New Logging Interceptor. The logging-interceptor subproject offers simple request and response logging. It may be configured to log headers and bodies for debugging. It requires this Maven dependency:

HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(Level.BASIC);
client.networkInterceptors().add(logging);

okhttp/CHANGELOG.md at master · square/okhttp

残念なことに retrofit 2.0.0-beta2 での同梱は 2.5.0 .

<!-- Dependencies -->
<android.version>4.1.1.4</android.version>
<android.platform>16</android.platform>
<okhttp.version>2.5.0</okhttp.version>
<animal.sniffer.version>1.14</animal.sniffer.version>

retrofit/pom.xml at master · square/retrofit

なので logging-interceptor 2.6.0 で.

    <dependency>
      <groupId>com.squareup.okhttp</groupId>
      <artifactId>okhttp</artifactId>
      <version>${project.version}</version>
    </dependency>

okhttp/okhttp-logging-interceptor at master · square/okhttp

compile 'com.squareup.okhttp:logging-interceptor:2.6.0' 
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();  
logging.setLevel(Level.BASIC);
OkHttpClient client = new OkHttpClient();  
httpClient.interceptors().add(logging);
Retrofit retrofit = new Retrofit.Builder()  
   .baseUrl(API_BASE_URL)
   .addConverterFactory(GsonConverterFactory.create())
   .client(httpClient)
   .build();

出力.

...
11:33:04.547 17090-17108 D/OkHttp: <-- HTTP/1.1 200 OK (469ms, 259-byte body)
11:33:04.550 17090-17296 D/OkHttp: --> GET /v5/item/1072964 HTTP/1.1
11:33:04.563 17090-17263 D/OkHttp: <-- HTTP/1.1 200 OK (250ms, 244-byte body)
11:33:04.566 17090-17108 D/OkHttp: --> GET /v5/item/1073510 HTTP/1.1
11:33:04.606 17090-17265 D/OkHttp: <-- HTTP/1.1 200 OK (252ms, 228-byte body)
11:33:04.609 17090-17263 D/OkHttp: --> GET /v5/item/1072585 HTTP/1.1
11:33:04.794 17090-17296 D/OkHttp: <-- HTTP/1.1 200 OK (244ms, 183-byte body)
11:33:04.796 17090-17265 D/OkHttp: --> GET /v5/item/1073275 HTTP/1.1

stable で対応するのかな.



消してしまった不要な通知を2度とこないように「通知履歴」から非表示設定する

朝起きたら

ふと気がついたら

どうでもいい通知が通知バーに満載.

screenshot-1445071325811

通知バーを開いてこれらを削除.

「通知をさせないように設定できる」ことはなんとなく知っているけど, なんだか面倒くさい.

などと思いつつ今日も何回も通知たちを削除する.

screenshot-1445071325811

なんだろうな, この毎度の無駄な動作.

通知の設定画面はいくつもある

設定が複雑な雰囲気がしてなんとなく設定することがおっくうになる.

例えば Twitter アプリからの通知表示を設定する場合, 以下の3つの画面から設定非表示にできる.

1. アプリの設定画面

通知を表示しているアプリを開いてそのアプリ内の詳細な設定画面で非表示にする.

20151017-100353

2. 設定の「アプリの通知」

Android(OS)自体の「設定」から.

「設定」-「通知」-「アプリの通知」-(通知しているアプリを選択)

20151017-100546

3. アプリ情報の画面

これも Android(OS)自体の「設定」.

「設定」-「アプリ」- (通知しているアプリを選択)

20151017-100635

それぞれの画面を見比べてみると, 「通知の設定」内の項目はいくつもあって, 画面によって項目が違う.

どのアプリが通知を表示していたのかわからない

通知のメッセージやアイコンを見てもどのアプリか分からないことがある.

タップするとPlayストアの見たこともないアプリのインストール画面が開くというインストールの勧誘. ブラウザが開いてサイトへの誘導もあったり.

普通にタップすると通知は消えてしまう.

通知を表示しているアプリ の特定ができないと通知の非表示設定はできない.

表示されている通知を長押しすると

表示されている通知を長押しで表示される i ボタンをタップでも 2.設定の「アプリの通知画面」を表示できる.

20151017-101731 3

ベルマークをタップすると 「通知のフィルタリング」画面へ記録されてアプリ名と通知の内容は残すことができる.

「設定」-「通知」-「通知のフィルタリング」

20151017-101731 2

が, めんどくさいのか, イラッとしてなのか, すぐに通知を消してしまう.

そして, また表示されることになる.

設定ウィジェットの「通知ログ」を使う

アプリをインストールする必要はありません.

設定項目別の「通知ログウィジェット」をホームに置いておきます.

20151017-100000

20151017-100027

20151017-100055

20151017-100109

タップすると, 通知を表示したアプリの履歴を最近順に見ることができます.

20151017-103438

消したい通知を見つけてタップすれば 3.アプリ情報の画面 が表示されるので「通知を表示」のチェックボックスをOFFにします.

20151017-100635

これなら通知を消したあとでも, かんたんに「アプリの特定」と「通知をOFF」を行うことができます.

通知が表示されない とかどうせブロックの設定だろ! → 原因「フィルター」


強力なスキーム「android-app://」でサイト内リンクのクリックからIntentを自在に投げる

例えば, YouTubeのURLがあって,

http://www.youtube.com/watch?v=dQw4w9WgXcQ

WEBブラウザ向けにリンクを貼る場合

<a href="http://www.youtube.com/watch?v=dQw4w9WgXcQ">→ Go Movie</a>

と書く.

→ Go Movie

Android端末上では, これをクリックするとデフォルトのアプリ設定がされてない場合は暗黙的インテントが発行されて,

1. 該当アプリ選択ダイアログ

のあと,

2-a. ブラウザでYouTubeサイトの動画が表示される.
2-b. YouTubeアプリで動画が表示される.

となる.

ブラウザアプリとYouTubeアプリをインストールはほとんどの人ががインストールしているだろう.

20151015-083102

20151015-083210

そのリンク記述を

android-app://{package_id}[/{scheme}[/{host}[/{path}]]][#Intent;{...}]

の書式で書く. 書式内 {package_id} は必須.

<a href="android-app://com.google.android.youtube/http/www.youtube.com/watch?v=dQw4w9WgXcQ">→ Go Movie from android-app</a>

これをクリックすると, YouTubeアプリに対して明示的インテントが発行されて, 該当する動画が表示される.

→ Go Movie from android-app

これは以下をセットした明示的インテントを投げるのと等価.

Action:	 ACTION_VIEW
Data:    http://www.youtube.com/watch?v=dQw4w9WgXcQ
Package: com.google.android.youtube

もし YouTube アプリをインストールしていない場合は PlayStoreアプリが起動してYouTubeアプリの画面が表示されてそのままインストールすることができる.

20151015-084402

この書式を使うと

「該当アプリの選択」
「アプリのデフォルトの設定のクリア」

というユーザからみて煩わしい動作がなくなる上, 明示的インテントの

「該当するパッケージがみつからない」

という場合に対しての開発側の手間も省ける.

書式にあるようにこんな記述も可能.

<a href="android-app://com.example.app/
  #Intent;action=com.example.MY_ACTION;
  i.some_int=100;S.some_str=hello;end">...

これは以下明示的インンテントと等価.

Action:	 com.example.MY_ACTION
Package: com.example.app
Extras:	 some_int=(int)100
         some_str=(String)hello

便利だが, いつからこんなのあったんだ?

スキームはスキームなのかっ!?

注意: ブラウザ互換

Intent | Android Developers

Cross Reference: ../Intent.java