【Android】VideoViewを使って動画再生アプリを作る①
-- ストレージへのアクセス権限を取得 --

小さい子供に動画を見せていると、画面を触って停止してしまったりホーム画面へ戻ってしまったりということがあるので、これを防止した単純な動画再生アプリを作ってみます。

要件

はじめにざっくりとした要件をまとめます。

  • 内部ストレージからmp4ファイルを検索
    ※SDカードなどの外部ストレージは今回対象外
  • 動画ファイル名をリスト表示
    (できれば動画のイメージを取得してリスト上に表示したい、どうやって取得するんだろう...)
  • ファイル名タップで全画面表示で動画再生
  • 再生中に画面をタップしても何もしない
  • 最後まで再生したら最初に戻って繰り返す

実装については以前作った Json Viewer の大部分が流用できると思うのでこれを改修していく形になります。

https://github.com/s-watanabe-apps/json-viewer.git

こちらの実装についての詳細を、次回リスト編と再生編に分けて解説していこうと思います。

実装

内部ストレージからファイルを検索するので、アプリケーションにストレージへのアクセス権限が必要です。

通常権限を取得する場合、Android OSにより以下右のダイアログを出してユーザーに許可を求めます。しかし何のために該当の権限を利用するかこのダイアログだけではわかりません。左画像のように権限の利用目的を明示してあげるのが親切な設計です。

※アプリケーションから権限の取得方法には以前 記事 にしましたが、今回は以下のように利用目的の表示を明示するようにしました。

権限設定

AndroidManifest.xml

AndroidManifest.xmlに以下を追加します。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

権限の確認と利用目的の説明

まずは権限が許可されているかをチェックし、許可されていない場合(もしくは初回起動のとき)に利用目的をユーザーに明示します。そこでOKを押してもらったときに requestPermissions メソッドにより権限の取得を行います。これらの処理を checkPermission で定義したので onCreate で呼び出せばOKです。

public void checkPermission() {
    if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
        // 権限の利用目的をダイアログで表示
        new AlertDialog.Builder(MainActivity.this)
            .setTitle("ダイアログタイトル")
            .setMessage("権限の利用目的を説明")
            .setCancelable(false)
            .setNegativeButton(getString(R.string.dialog_cancel),
                new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // キャンセルを押された場合はアプリ終了
                    finish();
                }
            })
            .setPositiveButton(getString(R.string.dialog_ok),
                new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // OKを押された場合はパーミッションを取得
                    requestPermissions(new String[]{
                        Manifest.permission.READ_EXTERNAL_STORAGE},
                        REQUEST_PERMISSION_READ_EXTERNAL_STORAGE);
                }
            })
            .show();
    } else{
        // すでに許可されている場合画面初期化
        init();
    }
}

requestPermissions メソッドは AppCompatActivity のメソッドで、これを呼び出すと冒頭イメージの右ダイアログが表示されます。

権限取得時の処理

次に onRequestPermissionsResult をオーバーライドして実装します。これは権限許可ダイアログでOK、またはキャンセルを押されたときに呼び出されます。

@Override
public void onRequestPermissionsResult(
    int requestCode, String permissions[], int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch(requestCode) {
        case REQUEST_PERMISSION_READ_EXTERNAL_STORAGE:
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                init();
            } else{
                finish();
            }
            break;
        default:
            break;
    }
}

引数の requestCode は呼び出すときに指定した REQUEST_PERMISSION_READ_EXTERNAL_STORAGEが入ってきます。この数値は何でもいい任意の数値なので定数で切っておきます。

grantResults には許可されたか/拒否されたかのフラグが入ってくるのでこれをみてその後の処理を行います。一般的には許可された場合、画面等の初期化を行い、拒否された場合続行不可能なのでアプリケーションを終了します。

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

docker-compose で起動したweb、MySQLに接続できない事象

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)