日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android实训日志:基于外部存储的音乐播放器V04

發(fā)布時間:2025/4/5 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android实训日志:基于外部存储的音乐播放器V04 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 項(xiàng)目功能
  • 實(shí)現(xiàn)步驟
    • 創(chuàng)建安卓應(yīng)用
    • 將圖片素材放入drawable
    • 按鈕背景圖片選擇器
    • 在項(xiàng)目清單文件里設(shè)置安卓應(yīng)用的圖標(biāo)和授權(quán)訪問外置存儲卡
    • 主布局資源文件activity_main.xml
    • 創(chuàng)建music_name_list_item.xml文件
    • 創(chuàng)建子包
      • 編寫MusicAdapter
      • 編寫Music
      • 編寫MusicPlayerApplition
    • 主界面類 - MainActivity
      • 聲明變量
      • 通過資源標(biāo)識符獲取控件實(shí)例
      • 播放器
      • 存儲讀寫權(quán)限
      • 設(shè)置線程并啟動
      • 創(chuàng)建消息處理器,接收子線程發(fā)送的消息
      • 給音樂列表控件注冊監(jiān)聽器
      • 給媒體播放器注冊完成監(jiān)聽器
      • 填充音樂列表異步任務(wù)類
      • 播放方法
      • 暫停方法
      • 播放|暫停按鈕單擊事件處理方法
      • 下一首音樂
      • 上一首音樂
      • 上一首|下一首按鈕單擊事件處理方法
      • 銷毀回調(diào)方法,釋放資源
    • 運(yùn)行效果

項(xiàng)目功能

在基于存儲卡音樂播放器V0.3基礎(chǔ)上,作如下修改:
創(chuàng)建方法能掃描存儲卡上所有mp3文件(采用遞歸算法)
用自定義應(yīng)用程序類存放全局?jǐn)?shù)據(jù)和方法
利用異步任務(wù)來完成耗時的存儲卡掃描工作

實(shí)現(xiàn)步驟

創(chuàng)建安卓應(yīng)用

將圖片素材放入drawable

按鈕背景圖片選擇器

在項(xiàng)目清單文件里設(shè)置安卓應(yīng)用的圖標(biāo)和授權(quán)訪問外置存儲卡

主布局資源文件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>

創(chuàng)建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>

創(chuàng)建子包

  • 創(chuàng)建ui子包,將MainActivity拖進(jìn)ui子包
  • 創(chuàng)建adapter字包,在里面創(chuàng)建MusicAdapter
  • 創(chuàng)建entity子包,在里面創(chuàng)建Music實(shí)體類
  • 創(chuàng)建app子包,在里面創(chuàng)建MusicPlayerApplication實(shí)體類

編寫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; // 音樂列表/*** 構(gòu)造方法** @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;// 判斷轉(zhuǎn)換視圖是否為空if (convertView == null) {// 將列表項(xiàng)模板映射成轉(zhuǎn)換視圖convertView = LayoutInflater.from(context).inflate(R.layout.music_name_list_item, null);// 創(chuàng)建視圖容器對象holder = new ViewHolder();// 實(shí)例化轉(zhuǎn)換視圖里的控件holder.tvMusicName = convertView.findViewById(R.id.tvMusicName);// 將視圖容器附加到轉(zhuǎn)換視圖convertView.setTag(holder);} else {// 從轉(zhuǎn)換視圖里取出視圖容器holder = (ViewHolder) convertView.getTag();}// 獲取列表項(xiàng)要顯示的數(shù)據(jù)Music music = musicList.get(position);// 設(shè)置列表項(xiàng)控件的屬性(去掉路徑和擴(kuò)展名)holder.tvMusicName.setText(music.getMusicName().substring(music.getMusicName().lastIndexOf("/") + 1, music.getMusicName().lastIndexOf(".")));// 返回轉(zhuǎn)換視圖return convertView;}/*** 視圖容器*/private static class ViewHolder {TextView tvMusicName;} }

編寫Music

package com.zjs.sdcard_music_player_v04.entity;/*** 功能:音樂實(shí)體類*/ 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;/*** 功能:音樂播放器應(yīng)用程序類*/ public class MusicPlayerApplication extends Application {private SimpleDateFormat sdf; // 簡單日期格式@Overridepublic void onCreate() {super.onCreate();// 實(shí)例化簡單日期格式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數(shù)組(File既可以指向目錄,也可以指向文件)File[] files = dir.listFiles();// 遍歷File數(shù)組for (File file : files) {// 判斷file是否是文件if (file.isFile()) { // file是文件// 按照后綴來過濾文件if (file.getName().endsWith(suffix)) {// 將滿足條件的文件添加到文件列表typeFileList.add(file.getAbsolutePath());}} else { // file是目錄// 目錄非空,遞歸調(diào)用if (file.list() != null) {makeTypeFileList(file, suffix, typeFileList);}}}}/*** 獲取音樂列表** @return 音樂列表*/public List<Music> getMusicList() {// 聲明音樂列表List<Music> musicList = null;// 獲取外置存儲卡根目錄File sdRootDir = Environment.getExternalStorageDirectory();// 創(chuàng)建后綴字符串String suffix = ".mp3";// 創(chuàng)建音樂文件列表List<String> musicFileList = new ArrayList<>();// 調(diào)用方法,生成指定目錄下某種類型文件列表makeTypeFileList(sdRootDir, suffix, musicFileList);// 判斷音樂文件列表里是否有元素if (musicFileList.size() > 0) {// 實(shí)例化音樂列表musicList = new ArrayList<>();// 遍歷音樂文件列表for (String musicFile : musicFileList) {// 創(chuàng)建音樂實(shí)體Music music = new Music();// 設(shè)置實(shí)體屬性music.setMusicName(musicFile);// 將音樂實(shí)體添加到音樂列表musicList.add(music);}}// 返回音樂列表return musicList;} }

主界面類 - MainActivity

聲明變量

通過資源標(biāo)識符獲取控件實(shí)例

播放器

存儲讀寫權(quán)限

設(shè)置線程并啟動

創(chuàng)建消息處理器,接收子線程發(fā)送的消息

給音樂列表控件注冊監(jiān)聽器

給媒體播放器注冊完成監(jiān)聽器

填充音樂列表異步任務(wù)類


播放方法

暫停方法

播放|暫停按鈕單擊事件處理方法

下一首音樂

上一首音樂

上一首|下一首按鈕單擊事件處理方法

銷毀回調(diào)方法,釋放資源

運(yùn)行效果


總結(jié)

以上是生活随笔為你收集整理的Android实训日志:基于外部存储的音乐播放器V04的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 精品视频在线播放 | 久久黄色一级视频 | 男生c女生| 91中文字幕在线视频 | 色图综合网 | 在线观看波多野结衣 | 久久久久一区二区精码av少妇 | 亚洲性自拍 | 潘金莲三级80分钟 | 久久爱伊人| 成人做爰黄 | 亚洲国产精品狼友在线观看 | 国产人妻精品久久久久野外 | 国产精品久久久久久久9999 | av资源网址 | av三级在线观看 | 新婚若妻侵犯中文字幕 | 国产三级按摩推拿按摩 | 在线观看无码精品 | 少妇一级淫片免费播放 | 自拍视频网站 | 国产精品美女久久久网av | 亚洲国产欧美精品 | 国产777| 成人综合区 | 日韩三级欧美 | 成人爽a毛片一区二区免费 日本高清免费看 | 深夜在线网站 | 深夜视频在线免费观看 | 一区二区三区免费在线 | 天天国产视频 | 尤物视频在线免费观看 | 美女扒开让男人桶爽 | 免费黄色美女网站 | 午夜在线播放视频 | 久久久久免费精品 | 亚洲一区二区三区久久久 | 欧美性生活视频 | 亚洲av成人精品毛片 | 国产视频99 | 青青一区二区 | 午夜偷拍福利视频 | 91免费片| 成年人免费在线观看 | 欧美日韩国产中文字幕 | 亚洲国产精品无码观看久久 | 久草aⅴ | 激情女主播 | 中文字幕观看av | 岳乳丰满一区二区三区 | 九九热视| 久久久久综合网 | 久久久久久久穴 | 2018av在线 | 五月婷婷爱爱 | 国产福利不卡视频 | 人人干av | 黑人精品无码一区二区三区AV | 欧美乱大交xxxxx | 国产精品麻豆一区二区 | 狠狠操狠狠操 | 久久人人爽人人爽人人av | av优选在线观看 | 综合热久久 | 久久久久久久久久网 | 亚洲综合网址 | caopor超碰 | 看片国产 | 青青草狠狠干 | 寂寞人妻瑜伽被教练日 | 狠狠爱夜夜爱 | 少妇毛片一区二区三区粉嫩av | 51调教丨国产调教视频 | 黑人激情视频 | 精品综合在线 | av777777| 久青草视频 | 农村妇女毛片精品久久久 | 中国女人内谢69xxxxⅹ视频 | 国产精品第十页 | 秘密基地动漫在线观看免费 | 婷婷久久综合网 | 亚洲久久在线 | 国产资源网站 | 欧美在线导航 | 男女做网站 | 欧美日韩电影一区二区三区 | 欧美日韩成人一区二区三区 | 红桃视频国产 | 美女福利视频导航 | 欧美婷婷六月丁香综合色 | 玖玖爱av| 国产成人精品一区二区三区在线 | aaa黄色大片 | 日本女优在线看 | 午夜国产在线 | 日本视频黄 | 国产一区免费 | 美女88av|