ミュージック プレイヤー アプリ 前編(.ktファイル以外)
「小説家になろう」の「7万文字以内」の制限のため、前中後編の3つに分けました。
Githubで文字パターン「正規表現」で音楽ファイルを検索できるミュージック プレイヤー アプリの.apkファイルなどをパブリック ドメインで公開しております。
マイクロソフトのBing検索エンジンで「github android-free-searchable-music-player」などで検索してみてください。
残念ながらグーグル検索エンジンでは検索できません。
(音楽を含む)音声ファイルを文字パターン「正規表現」による(含有)検索条件と除外条件で曲名、アーティスト名、アルバム名、ファイルのパスを検索できるアンドロイド スマホのミュージック プレイヤー アプリ(プレイリスト機能無し)を自作しました。
検索条件、除外条件、曲名、アーティスト名、アルバム名、ファイルのパスの全角英大文字(Aなど)、全角英小文字(aなど)、半角英大文字(Aなど)を半角英小文字(aなど)に置換し、全角数字を半角数字に置換してから文字を比較します。
「正規表現」とは、プログラミング言語などで少しの違いが有りますが、大体、共通している、文字パターンの書き方です。
例えば、「正規表現」で「revolution|abingdon|西川」は「『revolution』または『abingdon』または『西川』」を意味します。「正規表現」で半角縦線(|)は「または」を意味します。
また、例えば、「正規表現」で「fall in love.+live」には「fall in love live ver」や「fall in love(live ver)」などが該当する物として検索に引っかかります。「正規表現」で「.+」は「1文字以上の任意の文字」を意味し、「.*」は「0文字以上の任意の文字」を意味し、「\.」は半角ドット自体である「.」を意味し、「\(」は半角括弧自体である「(」を意味します。
2023年9月29日時点で、無駄な処理が有るかもしれませんし、通知の処理に自信が無いですし、権限の許可の確認などのコードを全ては網羅できていませんが、下記に書き残しておきます。
AQUOS sense3、Pixel 7a、FireHD8第12世代2022年で動作を確認できました。
広告、無いです。
アプリ内課金、無いです。
Bluetoothイヤホンで聴く事ができますし、一時停止や次の曲への移動や音量の増減などの操作もできます。
電話が、かかってきた時に、当アプリを一時停止して、通話が終了したら、当アプリの音楽の再生を再開します。
現在、再生している分と秒を表示します。
バック グラウンド再生できます。
有線イヤホンが抜けた時に音楽の再生を一時停止します。
Bluetoothイヤホンで、31分以上、数時間連続でバック グラウンド再生しましたが、問題無かったです。
有線イヤホンのバック グラウンド再生は、スマホを再起動した直後は、正常に動作しますが、しばらくスマホを使用していると、スリープされてしまいました。もしかしたら、バック グラウンド処理の優先度の設定が必要なのかもしれませんが、現時点では不明です。
2024年12月19日21時頃、画面の横幅が大きいタブレットなどで、音楽ファイルの一覧が中央寄せされていなかった不具合を、中央寄せするようにmusic_list.xmlとmusic_list_row.xmlを修正しました。
※下記のXMLファイルなどのコードをコピペする場合は、2文字の全角空白を4文字の半角空白に置換してください。
「androidx.media」パッケージを利用するのに必要な「implementation "androidx.media:media:1.6.0"」という記述を、Android Studioで、build.gradleの「dependencies」ブロックの中に追加してから、「Sync now」をクリックします。
2025年2月6日に脆弱性CVE-2022-24329へ対応するため、build.gradleの依存ライブラリーを安全な新しいバージョンに更新しました。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/build.gradle
――――――――――――――――――――
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'eliphas1810.freesearchablemusicplayer'
compileSdk 34
defaultConfig {
applicationId "eliphas1810.freesearchablemusicplayer"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.13.1'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.12.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation "androidx.media:media:1.7.0"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。
※build.gradleを変更後にAndroid Studioで「Sync now」をクリックしないと「androidx.media」パッケージが認識されません。
当アプリがREAD_MEDIA_AUDIO、READ_EXTERNAL_STORAGEという当アプリ外の(音楽を含む)音声メディア ファイルを読み取る権限を必要とするという宣言をアンドロイド スマホのアプリのマニフェスト ファイルに追加します。
バック グラウンド処理に必要な「フォア グラウンド サービス」の権限の宣言をアンドロイド スマホのアプリのマニフェスト ファイルに追加します。
2025年2月6日に、アンドロイド14対応で、「フォア グラウンド サービス」のタイプ(種類)の宣言をアンドロイド スマホのアプリのマニフェスト ファイルに追加しました。
バック グラウンドで音楽を再生中に、画面がスリープされても、CPUがスリープされないようにする設定処理を書くのに必要な、WAKE_LOCKの権限の宣言をアンドロイド スマホのアプリのマニフェスト ファイルに追加します。
画面遷移の設定をアンドロイド スマホのアプリのマニフェスト ファイルに追加します。
「サービス」の設定をアンドロイド スマホのアプリのマニフェスト ファイルに追加します。
Bluetoothイヤホンなどの物理ボタンである「メディア ボタン」の操作イベントを「メディア セッション」から受け取るための「android.media.browse.MediaBrowserService」の設定をアンドロイド スマホのアプリのマニフェスト ファイルの「サービス」の設定に追加します。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/src/main/AndroidManifest.xml
――――――――――――――――――――
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" /><!-- Android14で、フォアグラウンドサービスのタイプ(種類)の設定が必要化 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.FreeSearchableMusicPlayer"
tools:targetApi="31"
>
<activity
android:name=".MainActivity"
android:exported="true"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MusicList"
android:parentActivityName=".MainActivity"
>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"
/>
</activity>
<activity
android:name=".MusicDetail"
android:parentActivityName=".MusicList"
>
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MusicList"
/>
</activity>
<!-- Android14で、フォアグラウンドサービスのタイプ(種類)の設定が必要化 -->
<service
android:name=".MusicPlayerService"
android:enabled="true"
android:exported="true"
android:foregroundServiceType="mediaPlayback"
>
<intent-filter>
<action android:name="android.media.browse.MediaBrowserService" />
</intent-filter>
</service>
</application>
</manifest>
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/src/main/res/values/strings.xml
――――――――――――――――――――
<resources>
<string name="app_name">FreeSearchableMusicPlayer</string>
<string name="minutes_unit_label">minutes</string>
<string name="seconds_and_milli_seconds_separator">.</string>
<string name="seconds_unit_label">seconds</string>
<string name="main_inclusion_pattern_label">Inclusion Pattern "Regular Expression"</string>
<string name="main_inclusion_pattern_init"></string>
<string name="main_exclusion_pattern_label">Exclusion Pattern "Regular Expression"</string>
<string name="main_exclusion_pattern_init"></string>
<string name="main_search">Search</string>
<string name="music_list_close">Close</string>
<string name="music_detail_close">Close</string>
<string name="music_detail_start">Play</string>
<string name="music_detail_pause">Pause</string>
<string name="music_detail_stop">Stop</string>
<string name="music_detail_previous">Previous</string>
<string name="music_detail_next">Next</string>
<string name="music_detail_loop">Single Loop Mode</string>
<string name="music_detail_random">Random Mode</string>
<string name="no_music_file_list">Applicable music files are not found.</string>
<string name="ok">OK</string>
<string name="denied_read_media_audio">Now this application does not have the permission to read audio media files( including music files) by others applications. So this applicatiopn can not read music files and show music files. Please finish this application.</string>
<string name="denied_read_external_storage">Now this application does not have the permission to read files( including music files) by others applications. So this applicatiopn can not read music files and show music files. Please finish this application.</string>
<string name="main_inclusion_pattern_wrong">The inclusion is wrong as "regular expression".</string>
<string name="main_exclusion_pattern_wrong">The exclusion is wrong as "regular expression".</string>
<string name="notification_content_title">Notification title</string>
<string name="notification_content_text">Notification text</string>
<string name="notification_ticker">Notification ticker</string>
</resources>
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。
画面に表示する文字の日本語対応の設定のXMLファイルを置くres/values-ja/ディレクトリを用意します。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/src/main/res/values-ja/strings.xml
――――――――――――――――――――
<resources>
<string name="app_name">FreeSearchableMusicPlayer</string>
<string name="minutes_unit_label">分</string>
<string name="seconds_and_milli_seconds_separator">.</string>
<string name="seconds_unit_label">秒</string>
<string name="main_inclusion_pattern_label">検索条件の文字パターン「正規表現」</string>
<string name="main_inclusion_pattern_init"></string>
<string name="main_exclusion_pattern_label">除外条件の文字パターン「正規表現」</string>
<string name="main_exclusion_pattern_init"></string>
<string name="main_search">検索</string>
<string name="music_list_close">閉じる</string>
<string name="music_detail_close">閉じる</string>
<string name="music_detail_start">再生</string>
<string name="music_detail_pause">一時停止</string>
<string name="music_detail_stop">停止</string>
<string name="music_detail_previous">前の曲へ</string>
<string name="music_detail_next">次の曲へ</string>
<string name="music_detail_loop">1曲だけループ モード</string>
<string name="music_detail_random">ランダム モード</string>
<string name="no_music_file_list">条件に該当する音楽ファイルが見つかりませんでした。</string>
<string name="ok">わかりました</string>
<string name="denied_read_media_audio">当アプリ以外による音楽を含む音声メディア ファイルを読み取る権限の許可が無いので、当アプリは音楽ファイルを表示して再生できません。当アプリを終了してください。</string>
<string name="denied_read_external_storage">音楽ファイルを含む当アプリ以外によるファイルを読み取る権限の許可が無いので、当アプリは音楽ファイルを表示して再生できません。当アプリを終了してください。</string>
<string name="main_inclusion_pattern_wrong">検索条件が「正規表現」として間違っています。</string>
<string name="main_exclusion_pattern_wrong">除外条件が「正規表現」として間違っています。</string>
<string name="notification_content_title">通知の見出し</string>
<string name="notification_content_text">通知文</string>
<string name="notification_ticker">通知ティッカー</string>
</resources>
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/src/main/res/values/colors.xml
――――――――――――――――――――
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="gray">#FF808080</color><!-- #AARRGGBB。アルファ値のFF = 255は不透明。 -->
<color name="silver">#FFC0C0C0</color>
<color name="lime">#FF00FF00</color>
</resources>
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/src/main/res/layout/activity_main.xml
――――――――――――――――――――
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:id="@+id/mainInclusionPatternLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_inclusion_pattern_label"
android:layout_gravity="center"
/>
<EditText
android:id="@+id/mainInclusionPattern"
android:layout_width="match_parent"
android:layout_height="50dp"
android:ems="10"
android:inputType="text"
android:text="@string/main_inclusion_pattern_init"
/>
<TextView
android:id="@+id/mainExclusionPatternLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_exclusion_pattern_label"
android:layout_gravity="center"
/>
<EditText
android:id="@+id/mainExclusionPattern"
android:layout_width="match_parent"
android:layout_height="50dp"
android:ems="10"
android:inputType="text"
android:text="@string/main_exclusion_pattern_init"
/>
<Button
android:id="@+id/mainSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/main_search"
android:layout_gravity="center"
/>
</LinearLayout>
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。
※レイアウトXMLファイルのEditTextタグのandroid:text属性によるテキストボックスの初期表示値が結果的にゼロ文字に成る場合、Android Studioは赤文字で警告を表示しますが、無視しても問題は無かったです。
※レイアウトXMLファイルのEditTextタグのandroid:layout_height属性にwrap_contentを指定すると、テキストボックスの表示に問題が有りましたし、Android Studioは48dp以上を指定するように赤文字で警告を表示するので、50dpなどと指定します。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/src/main/res/layout/music_list.xml
――――――――――――――――――――
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/musicListClose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_list_close"
android:layout_gravity="center"
/>
<ListView
android:id="@+id/musicList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/src/main/res/layout/music_list_row.xml
――――――――――――――――――――
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:id="@+id/musicListMusicTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
/>
<TextView
android:id="@+id/musicListArtistName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
/>
<TextView
android:id="@+id/musicListAlbumTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
/>
<TextView
android:id="@+id/musicListMusicFilePath"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
/>
<TextView
android:id="@+id/musicListMusicDuration"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
/>
</LinearLayout>
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。
/home/◯◯◯/AndroidStudioProjects/FreeSearchableMusicPlayer/app/src/main/res/layout/music_detail.xml
――――――――――――――――――――
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:id="@+id/musicDetailClose"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_detail_close"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/musicDetailMusicTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/musicDetailArtistName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/musicDetailAlbumTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/musicDetailMusicFilePath"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
<TextView
android:id="@+id/musicDetailMusicDuration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
<SeekBar
android:id="@+id/musicDetailMusicCurrentDurationSeekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/musicDetailMusicCurrentDuration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
<Button
android:id="@+id/musicDetailStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_detail_start"
android:layout_gravity="center"
/>
<Button
android:id="@+id/musicDetailPause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_detail_pause"
android:layout_gravity="center"
/>
<Button
android:id="@+id/musicDetailStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_detail_stop"
android:layout_gravity="center"
/>
<Button
android:id="@+id/musicDetailPrevious"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_detail_previous"
android:layout_gravity="center"
/>
<Button
android:id="@+id/musicDetailNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_detail_next"
android:layout_gravity="center"
/>
<Button
android:id="@+id/musicDetailLoop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_detail_loop"
android:layout_gravity="center"
/>
<Button
android:id="@+id/musicDetailRandom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/music_detail_random"
android:layout_gravity="center"
/>
</LinearLayout>
――――――――――――――――――――
◯◯◯はLinux Mintのユーザー名です。
FreeSearchableMusicPlayerは著者が付けたAndroid Studioのプロジェクトの名前です。