Android实训日志:基于外部存储的音乐播放器V04
生活随笔
收集整理的這篇文章主要介紹了
Android实训日志:基于外部存储的音乐播放器V04
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 項目功能
- 實現步驟
- 創建安卓應用
- 將圖片素材放入drawable
- 按鈕背景圖片選擇器
- 在項目清單文件里設置安卓應用的圖標和授權訪問外置存儲卡
- 主布局資源文件activity_main.xml
- 創建music_name_list_item.xml文件
- 創建子包
- 編寫MusicAdapter
- 編寫Music
- 編寫MusicPlayerApplition
- 主界面類 - MainActivity
- 聲明變量
- 通過資源標識符獲取控件實例
- 播放器
- 存儲讀寫權限
- 設置線程并啟動
- 創建消息處理器,接收子線程發送的消息
- 給音樂列表控件注冊監聽器
- 給媒體播放器注冊完成監聽器
- 填充音樂列表異步任務類
- 播放方法
- 暫停方法
- 播放|暫停按鈕單擊事件處理方法
- 下一首音樂
- 上一首音樂
- 上一首|下一首按鈕單擊事件處理方法
- 銷毀回調方法,釋放資源
- 運行效果
項目功能
在基于存儲卡音樂播放器V0.3基礎上,作如下修改:
創建方法能掃描存儲卡上所有mp3文件(采用遞歸算法)
用自定義應用程序類存放全局數據和方法
利用異步任務來完成耗時的存儲卡掃描工作
實現步驟
創建安卓應用
將圖片素材放入drawable
按鈕背景圖片選擇器
在項目清單文件里設置安卓應用的圖標和授權訪問外置存儲卡
主布局資源文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:orientation="vertical"android:padding="20dp"tools:context=".ui.MainActivity"><ListViewandroid:id="@+id/lvMusicName"android:layout_width="match_parent"android:layout_height="0dp"android:layout_marginBottom="16dp"android:layout_weight="8" /><TextViewandroid:id="@+id/tvMusicName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="0.5"android:textColor="#0000ff"android:textSize="20sp" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_marginBottom="10dp"android:layout_weight="0.5"android:gravity="center"android:orientation="horizontal"><TextViewandroid:id="@+id/tvCurrentPosition"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textColor="#ff0000" /><ProgressBarandroid:id="@+id/pbMusicProgress"style="?android:attr/progressBarStyleHorizontal"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="6" /><TextViewandroid:id="@+id/tvDuration"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textColor="#ff00ff" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="0.5"android:gravity="center"android:orientation="horizontal"><Buttonandroid:id="@+id/btnPrevious"android:layout_width="60dp"android:layout_height="50dp"android:background="@drawable/previous_button_selector"android:onClick="doPrevious" /><Buttonandroid:id="@+id/btnPlayOrPause"android:layout_width="60dp"android:layout_height="50dp"android:background="@drawable/play_button_selector"android:onClick="doPlayOrPause" /><Buttonandroid:id="@+id/btnNext"android:layout_width="60dp"android:layout_height="50dp"android:background="@drawable/next_button_selector"android:onClick="doNext" /></LinearLayout> </LinearLayout>創建music_name_list_item.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"android:padding="10dp"><TextViewandroid:id="@+id/tvMusicName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"/> </LinearLayout>創建子包
- 創建ui子包,將MainActivity拖進ui子包
- 創建adapter字包,在里面創建MusicAdapter
- 創建entity子包,在里面創建Music實體類
- 創建app子包,在里面創建MusicPlayerApplication實體類
編寫MusicAdapter
package com.zjs.sdcard_music_player_v04.adapter;import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView;import com.zjs.sdcard_music_player_v04.R; import com.zjs.sdcard_music_player_v04.entity.Music;import java.util.List;/*** 功能:音樂適配器*/ public class MusicAdapter extends BaseAdapter {private Context context; // 上下文private List<Music> musicList; // 音樂列表/*** 構造方法** @param context* @param musicList*/public MusicAdapter(Context context, List<Music> musicList) {this.context = context;this.musicList = musicList;}@Overridepublic int getCount() {return musicList.size();}@Overridepublic Object getItem(int position) {return musicList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 聲明視圖容器ViewHolder holder = null;// 判斷轉換視圖是否為空if (convertView == null) {// 將列表項模板映射成轉換視圖convertView = LayoutInflater.from(context).inflate(R.layout.music_name_list_item, null);// 創建視圖容器對象holder = new ViewHolder();// 實例化轉換視圖里的控件holder.tvMusicName = convertView.findViewById(R.id.tvMusicName);// 將視圖容器附加到轉換視圖convertView.setTag(holder);} else {// 從轉換視圖里取出視圖容器holder = (ViewHolder) convertView.getTag();}// 獲取列表項要顯示的數據Music music = musicList.get(position);// 設置列表項控件的屬性(去掉路徑和擴展名)holder.tvMusicName.setText(music.getMusicName().substring(music.getMusicName().lastIndexOf("/") + 1, music.getMusicName().lastIndexOf(".")));// 返回轉換視圖return convertView;}/*** 視圖容器*/private static class ViewHolder {TextView tvMusicName;} }編寫Music
package com.zjs.sdcard_music_player_v04.entity;/*** 功能:音樂實體類*/ public class Music {private String musicName; // 音樂名public String getMusicName() {return musicName;}public void setMusicName(String musicName) {this.musicName = musicName;}@Overridepublic String toString() {return "Music{" +"musicName='" + musicName + '\'' +'}';} }編寫MusicPlayerApplition
package com.zjs.sdcard_music_player_v04.app;import android.app.Application; import android.os.Environment;import com.zjs.sdcard_music_player_v04.entity.Music;import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List;/*** 功能:音樂播放器應用程序類*/ public class MusicPlayerApplication extends Application {private SimpleDateFormat sdf; // 簡單日期格式@Overridepublic void onCreate() {super.onCreate();// 實例化簡單日期格式sdf = new SimpleDateFormat("mm:ss");}/*** 獲取格式化時間** @param time 單位是毫秒* @return mm:ss格式的時間*/public String getFormatTime(int time) {return sdf.format(time);}/*** 生成指定目錄下某種類型的文件列表** @param dir* @param suffix* @param typeFileList*/public void makeTypeFileList(File dir, String suffix, List<String> typeFileList) {// 獲取指定目錄下的File數組(File既可以指向目錄,也可以指向文件)File[] files = dir.listFiles();// 遍歷File數組for (File file : files) {// 判斷file是否是文件if (file.isFile()) { // file是文件// 按照后綴來過濾文件if (file.getName().endsWith(suffix)) {// 將滿足條件的文件添加到文件列表typeFileList.add(file.getAbsolutePath());}} else { // file是目錄// 目錄非空,遞歸調用if (file.list() != null) {makeTypeFileList(file, suffix, typeFileList);}}}}/*** 獲取音樂列表** @return 音樂列表*/public List<Music> getMusicList() {// 聲明音樂列表List<Music> musicList = null;// 獲取外置存儲卡根目錄File sdRootDir = Environment.getExternalStorageDirectory();// 創建后綴字符串String suffix = ".mp3";// 創建音樂文件列表List<String> musicFileList = new ArrayList<>();// 調用方法,生成指定目錄下某種類型文件列表makeTypeFileList(sdRootDir, suffix, musicFileList);// 判斷音樂文件列表里是否有元素if (musicFileList.size() > 0) {// 實例化音樂列表musicList = new ArrayList<>();// 遍歷音樂文件列表for (String musicFile : musicFileList) {// 創建音樂實體Music music = new Music();// 設置實體屬性music.setMusicName(musicFile);// 將音樂實體添加到音樂列表musicList.add(music);}}// 返回音樂列表return musicList;} }主界面類 - MainActivity
聲明變量
通過資源標識符獲取控件實例
播放器
存儲讀寫權限
設置線程并啟動
創建消息處理器,接收子線程發送的消息
給音樂列表控件注冊監聽器
給媒體播放器注冊完成監聽器
填充音樂列表異步任務類
播放方法
暫停方法
播放|暫停按鈕單擊事件處理方法
下一首音樂
上一首音樂
上一首|下一首按鈕單擊事件處理方法
銷毀回調方法,釋放資源
運行效果
總結
以上是生活随笔為你收集整理的Android实训日志:基于外部存储的音乐播放器V04的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: u盘插电脑上有声音 但读不出来怎么办 U
- 下一篇: 租客去世,房东私自拉走遗体怎么办?