【Android】VideoViewを使って動画再生アプリを作る
-- 不具合修正、軽微な修正 --

【Android】VideoViewを使って動画再生アプリを作る で作成したアプリを使っていたところ使いにくい点を発見したのでいくつか改修を入れました。

対応した内容

  • 再生中にスリープモードにしない
  • ファイルサイズを動画の総再生時間に変更
  • チェックボックスを付けて複数ファイルの再生に対応

再生中にスリープモードにしない

この対応は簡単で動画再生するActivityで以下1行入れるだけです。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

ファイルサイズを動画の総再生時間に変更

これはトップ画面のファイルリストでファイルサイズを表示していましたが、あまり意味が無いので再生時間を取得して表示するようにしました。以下のようにメソッド化したのでFileオブジェクトを渡してやれば秒数が返ってきます。

/**
 * 動画ファイル再生時間取得
 * @return int
 */
public static int getDuration(File audioFile) {
    try {
        MediaPlayer mediaPlayer = new MediaPlayer();
        FileInputStream inputStream = new FileInputStream(audioFile);;
        FileDescriptor fileDescriptor = inputStream.getFD();
        mediaPlayer.setDataSource(fileDescriptor);
        mediaPlayer.prepare();
        int length = mediaPlayer.getDuration();
        mediaPlayer.release();
        return length / 1000;
    } catch (Exception e) {
        return 0;
    }
}

これで取得した再生時間をAdapterでListViewにセットするときに以下のように分と秒で分けてやり表示します。

String time = (item.getSize() / 60) + ":" + String.format("%02d", item.getSize() % 60);

チェックボックスを付けて複数ファイルの再生に対応

res/layout/list_item.xml

まずはリストの1行を表すレイアウトファイルにCheckBoxを追加します。

    <CheckBox
        android:id="@+id/item_check"
        android:layout_marginLeft="8dp"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

また、親要素のLinearLayoutに以下の属性を追加します。

これを入れておかないとチェックボックス以外のイベントが発生しなくなってしまいます。

android:descendantFocusability="blocksDescendants"

チェックボックスはAdapterでOnClickイベントを設定することによってチェック状態を変更します。(それが次の処理)

ListAdapter.java

getViewメソッドでCheckBoxにチェック状態をセットし、OnClickイベントでチェック状態を更新します。

final CheckBox itemCheck = view.findViewById(R.id.item_check);
itemCheck.setChecked(item.isChecked());
itemCheck.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        if (!item.isChecked()) {
		    item.setChecked(true);
        } else {
            item.setChecked(false);
        }
        itemCheck.setChecked(item.isChecked());
    }
});

MainActivity

Mp4Activity呼び出し部分を修正します。

ListViewのonItemClickイベントでチェックの付いたアイテムでArrayListを作ります。

チェックが付いていない場合は、クリックされたアイテムのみにしています。

以前まではputStringでファイルパスを渡していましたが、putStringArrayListExtraに変更してListを渡します。

listView = findViewById(R.id.list_view);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
        ArrayList<String> paths = new ArrayList<>();
        for (Item item : listItems) {
            if (item.isChecked()) {
                paths.add(item.getPath() + "/" + item.getName());
            }
        }
        if (paths.size() == 0) {
            paths.add(listItems.get(pos).getPath() + "/" + listItems.get(pos).getName());
        }
        Intent intent = new Intent(MainActivity.this, Mp4Activity.class);
        intent.putStringArrayListExtra("paths", paths);
        startActivityForResult(intent, REQUEST_CODE_MP4);
    }
});

Mp4ActivityではgetStringArrayListExtraで渡されたListを取り出し、順番に再生します。(これについては割愛)

アプリケーション

https://play.google.com/store/apps/details?id=com.swapps.mp4viewer

対応したソースコード

https://github.com/s-watanabe-apps/mp4-viewer/releases/tag/1.1

コメント

このブログの人気の投稿

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

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

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