Android7.0 Nougatからsplit-screenの機能が加わっているが、読書尚友とEBPocket for Androidをsplit-screenに対応させてみた。
といっても日常的に使用しているZenfone 3 laserにはまだAndroid7.0アップデートが来ないので、エミュレータでの動作確認になる。
(あまりアップデートが遅れるようだと、初めからAndroid7.0が搭載された格安SIMフリーのnova liteあたりに買い換えたほうがいいかもしれない)
実はAndroid 7.0 に対応していないアプリでもsplit-screenは使用できるが、"app may not work with split-screen."というメッセージが表示されてしまう。
Android 7.0 Split-screen対応
マルチ ウィンドウのサポート | Android Developers
Split-screenにする要件は、
- 画面のサイズが動的に変更されても画面のパーツが正常に表示されること。読書尚友もEBPocketも画面の回転に対応しているので、これはクリアしている。
- targetSdkVersionを24(Android7.0)以上にする
- manifestsでapplicationかactivityに、android:resizeableActivity="true"を記述する。
エミュレータでの実行結果は次の通り。
縦横でEBPokcetのレイアウトが変わっていることがわかる。読書尚友で単語を選択してEBPocketでクリップボード検索で辞書を引くこともできる。これはEBシリーズ全体でやりたかったことのゴールに近い。
さてここで一つ問題があり、targetSdkVersionをAPI24(Android7.0)以上にするということは、API23(Android 6.0)で導入された新しいパーミッションの考え方に対応しないといけないということ。
どちらかというと、こちらの作業のほうが大変だった。
Android 6.0 パーミッション対応
実行時のパーミッション リクエスト | Android Developers
Android 5.x以前のパーミッションの考えかたは、アプリのインストール時に一括で許可を与えるものだったが、Android6.0からは、パーミッションを使用するときに個別に許可・不許可できるようになった。
例えば、「カメラは許可するが位置情報の使用は許可しない」とかを選択できるようになった。
読書尚友、EBPocketの場合は、WRITE_EXTERNAL_STORAGEのパーミッションが必要になる。
パーミッションがあるかどうかを確認し、ない場合は要求するコードは次の通り。
// 権限があるかどうか確認 int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // 説明が必要な場合。EBPocketの場合はパーミッションが必須なので要求 ActivityCompat.requestPermissions(this, new String{ Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQCODE_PERMISSION); } else { // 説明が不要な場合。パーミッションを要求する ActivityCompat.requestPermissions(this, new String{ Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQCODE_PERMISSION); } return; }
パーミッションの要求の結果はコールバックされる。
/** * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode, String permissions, int grantResults) { switch (requestCode) { case REQCODE_PERMISSION: { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // パーミッションの取得に成功した。 // パーミッションが必要な処理をここに書く } else { // パーミッションの取得に失敗した } } } }