Android实训日志:基于外部存储的音乐播放器V06
生活随笔
收集整理的這篇文章主要介紹了
Android实训日志:基于外部存储的音乐播放器V06
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- 項目功能
- 實現(xiàn)步驟
- 創(chuàng)建安卓應用
- 將圖片素材放入drawable和mipmap
- 創(chuàng)建按鈕背景圖片選擇器
- 在項目清單文件里授權(quán)訪問外置存儲卡,設(shè)置應用程序圖標
- 創(chuàng)建anim包里面創(chuàng)建animator.xml
- 主布局資源文件activity_main.xml
- 布局文件activity_splash_screen_activity.xml
- 字符串資源文件strings.xml
- 創(chuàng)建音樂名列表項模板music_name_list_item.xml
- 創(chuàng)建ui子包,將MainActivity拖進ui子包
- 創(chuàng)建entity子包,在里面創(chuàng)建音樂實體類 - Music
- 創(chuàng)建app子包,在里面創(chuàng)建音樂播放器應用程序類 - MusicPlayerApplication
- 給音樂播放器應用程序類注冊
- 創(chuàng)建adapter子包,在里面創(chuàng)建音樂適配器 - MusicAdapter
- 在app子包常見應用程序常量接口 - AppConstants
- 創(chuàng)建service子包,在里面創(chuàng)建音樂播放服務類 - MusicPlayService
- 主界面類 - MainActivity
- 在ui子包里創(chuàng)建SplashScreenActivity(啟動畫面)
- 運行效果
項目功能
- 在基于存儲卡音樂播放器V0.5基礎(chǔ)上,作如下修改:
1、添加啟動畫面(SplashScreenActivity)
2、添加音樂播放幕式功能:順序播放、隨機播放、單曲循環(huán)播放
3、將進度條(ProgressBar)改為拖拽條(SeekBar),用戶通過拖拽可自行設(shè)置音樂播放進度值
實現(xiàn)步驟
創(chuàng)建安卓應用
將圖片素材放入drawable和mipmap
創(chuàng)建按鈕背景圖片選擇器
在項目清單文件里授權(quán)訪問外置存儲卡,設(shè)置應用程序圖標
創(chuàng)建anim包里面創(chuàng)建animator.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"><alphaandroid:duration="3000"android:fromAlpha="0.0"android:toAlpha="1.0" /><rotateandroid:duration="3000"android:fromDegrees="0"android:pivotX="50%"android:pivotY="50%"android:repeatCount="1"android:repeatMode="reverse"android:toDegrees="+360" /> </set>主布局資源文件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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ProgressBarandroid:id="@+id/pbScanMusic"android:layout_width="100dp"android:layout_height="100dp"android:visibility="gone" /><TextViewandroid:id="@+id/tvScanMusic"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/scan_music"android:textColor="#0000ff"android:textSize="25sp"android:visibility="gone" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="@drawable/custom_border"android:gravity="center"android:orientation="horizontal"android:padding="5dp"><TextViewandroid:id="@+id/tv_play_mode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/play_mode"android:textSize="13sp" /><RadioGroupandroid:id="@+id/rg_play_mode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><RadioButtonandroid:id="@+id/rb_order"android:layout_width="wrap_content"android:layout_height="wrap_content"android:checked="true"android:text="@string/order"android:textSize="13sp" /><RadioButtonandroid:id="@+id/rb_random"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/random"android:textSize="13sp" /><RadioButtonandroid:id="@+id/rb_loop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/loop"android:textSize="13sp" /></RadioGroup></LinearLayout><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" /><SeekBarandroid:id="@+id/sb_music_progress"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>布局文件activity_splash_screen_activity.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/root_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/iv_music_icon"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:src="@drawable/music" /><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:text="@string/title"android:textColor="#0000ff"android:textSize="25sp" /><TextViewandroid:id="@+id/tv_version"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="@string/version"android:textColor="#ff0000"android:textSize="20sp" /><TextViewandroid:id="@+id/tv_author"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="@string/author"android:textColor="#000000"android:textSize="20sp" /> </LinearLayout>字符串資源文件strings.xml
創(chuàng)建音樂名列表項模板music_name_list_item.xml
創(chuàng)建ui子包,將MainActivity拖進ui子包
創(chuàng)建entity子包,在里面創(chuàng)建音樂實體類 - Music
創(chuàng)建app子包,在里面創(chuàng)建音樂播放器應用程序類 - MusicPlayerApplication
package com.zjs.sdcard_music_player_v06.app;import android.app.Application; import android.os.Environment;import com.zjs.sdcard_music_player_v06.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; // 簡單日期格式private int currentMusicIndex;//當前音樂索引private int currentPosition;//當前播放位置private int playMode;//播放模式private int progressChangedByUser;//用戶修改的播放進度@Overridepublic void onCreate() {super.onCreate();// 實例化簡單日期格式sdf = new SimpleDateFormat("mm:ss");}public int getCurrentMusicIndex() {return currentMusicIndex;}public void setCurrentMusicIndex(int currentMusicIndex) {this.currentMusicIndex = currentMusicIndex;}public int getCurrentPosition() {return currentPosition;}public void setCurrentPosition(int currentPosition) {this.currentPosition = currentPosition;}public int getPlayMode() {return playMode;}public void setPlayMode(int playMode) {this.playMode = playMode;}public int getProgressChangedByUser() {return progressChangedByUser;}public void setProgressChangedByUser(int progressChangedByUser) {this.progressChangedByUser = progressChangedByUser;}/*** 獲取格式化時間** @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) {// 實例化音樂列表musicList = new ArrayList<>();// 遍歷音樂文件列表for (String musicFile : musicFileList) {// 創(chuàng)建音樂實體Music music = new Music();// 設(shè)置實體屬性music.setMusicName(musicFile);// 將音樂實體添加到音樂列表musicList.add(music);}}// 返回音樂列表return musicList;} }給音樂播放器應用程序類注冊
創(chuàng)建adapter子包,在里面創(chuàng)建音樂適配器 - MusicAdapter
package com.zjs.sdcard_music_player_v06.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_v06.R;import java.util.List;public class MusicAdapter extends BaseAdapter {private Context context; // 上下文private List<com.zjs.sdcard_music_player_v06.entity.Music> musicList; // 音樂列表/*** 構(gòu)造方法** @param context* @param musicList*/public MusicAdapter(Context context, List<com.zjs.sdcard_music_player_v06.entity.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) {// 將列表項模板映射成轉(zhuǎn)換視圖convertView = LayoutInflater.from(context).inflate(R.layout.music_name_list_item, null);// 創(chuàng)建視圖容器對象holder = new ViewHolder();// 實例化轉(zhuǎn)換視圖里的控件holder.tvMusicName = convertView.findViewById(R.id.tvMusicName);// 將視圖容器附加到轉(zhuǎn)換視圖convertView.setTag(holder);} else {// 從轉(zhuǎn)換視圖里取出視圖容器holder = (ViewHolder) convertView.getTag();}// 獲取列表項要顯示的數(shù)據(jù)com.zjs.sdcard_music_player_v06.entity.Music music = musicList.get(position);// 設(shè)置列表項控件的屬性(去掉路徑和擴展名)holder.tvMusicName.setText(music.getMusicName().substring(music.getMusicName().lastIndexOf("/") + 1, music.getMusicName().lastIndexOf(".")));// 返回轉(zhuǎn)換視圖return convertView;}/*** 視圖容器*/private static class ViewHolder {TextView tvMusicName;} }在app子包常見應用程序常量接口 - AppConstants
package com.zjs.sdcard_music_player_v06.app;public interface AppConstants {String TAG = "net.hw.sdcard_musicplayer_v06"; // 應用程序標記String INTENT_ACTION_PREVIOUS = TAG + ".intent.action.PREVIOUS"; // 廣播頻道常量:播放上一首String INTENT_ACTION_PLAY = TAG + ".intent.action.PLAY"; // 廣播頻道常量:播放String INTENT_ACTION_PLAY_OR_PAUSE = TAG + ".intent.action.PLAY_OR_PAUSE"; // 廣播頻道常量:播放或暫停String INTENT_ACTION_NEXT = TAG + ".intent.action.NEXT"; // 廣播頻道常量:播放下一首String INTENT_ACTION_UPDATE_PROGRESS = TAG + ".intent.action.UPDATE_PROGRESS"; // 廣播頻道常量:更新播放進度String INTENT_ACTION_USER_CHANGE_PROGRESS = TAG + ".intent.action.USER_CHANGE_PROGRESS";//廣播頻道常量:用戶改變播放進度String CONTROL_ICON = "control_icon"; // 控制圖標名稱常量String DURATION = "duration"; // 播放時長名稱常量String CURRENT_POSITION = "current_position"; // 當前播放位置名稱常量int PLAY_MODE_ORDER = 0;//播放模式:順序播放int PLAY_MODE_RANDOM = 1;//播放模式:隨機播放int PLAY_MODE_LOOP = 2;//播放模式:單曲循環(huán) }創(chuàng)建service子包,在里面創(chuàng)建音樂播放服務類 - MusicPlayService
主界面類 - MainActivity
package com.zjs.sdcard_music_player_v06.ui;import android.Manifest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.RadioGroup; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat;import com.zjs.sdcard_music_player_v06.R; import com.zjs.sdcard_music_player_v06.adapter.MusicAdapter; import com.zjs.sdcard_music_player_v06.app.AppConstants; import com.zjs.sdcard_music_player_v06.app.MusicPlayerApplication; import com.zjs.sdcard_music_player_v06.service.MusicPlayService;import java.util.List;public class MainActivity extends AppCompatActivity implements AppConstants {private String musicName; // 音樂文件名private TextView tvMusicName; // 音樂名標簽private Button btnPlayOrPause; // 播放|暫停按鈕private MusicReceiver receiver;//音樂廣播接收器private TextView tvCurrentPosition; // 顯示當前播放位置的標簽private TextView tvDuration; // 顯示音樂播放時長的標簽private SeekBar sbMusicProgress;//音樂播放拖拽條private ListView lvMusicName; // 音樂名列表控件private List<com.zjs.sdcard_music_player_v06.entity.Music> musicList; // 音樂列表(數(shù)據(jù)源)private MusicAdapter adapter; // 音樂適配器private MusicPlayerApplication app; // 音樂播放器應用程序?qū)ο髉rivate ProgressBar pbScanMusic; // 掃描存儲卡音樂進度條private TextView tvScanMusic; // 掃描存儲卡音樂標簽(提示用戶耐心等待)private RadioGroup rgPlayMode;//播放模式單選按鈕組@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局資源文件設(shè)置用戶界面setContentView(R.layout.activity_main);// 通過資源標識符獲取控件實例lvMusicName = findViewById(R.id.lvMusicName);tvMusicName = findViewById(R.id.tvMusicName);btnPlayOrPause = findViewById(R.id.btnPlayOrPause);tvCurrentPosition = findViewById(R.id.tvCurrentPosition);tvDuration = findViewById(R.id.tvDuration);pbScanMusic = findViewById(R.id.pbScanMusic);tvScanMusic = findViewById(R.id.tvScanMusic);sbMusicProgress = findViewById(R.id.sb_music_progress);rgPlayMode = findViewById(R.id.rg_play_mode);// 獲取音樂播放器應用程序?qū)ο骯pp = (MusicPlayerApplication) getApplication();// 定義存儲讀寫權(quán)限數(shù)組String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};// 檢查是否有讀權(quán)限final int permission = ActivityCompat.checkSelfPermission(this, PERMISSIONS_STORAGE[0]);// 如果沒有授權(quán),那么就請求讀權(quán)限if (permission != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, 0);return;}//執(zhí)行填充音樂列表的異步任務new FillMusicListTask().execute();// 給音樂列表控件注冊監(jiān)聽器lvMusicName.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {// 獲取音樂索引app.setCurrentMusicIndex(position);// 當前播放位置歸零app.setCurrentPosition(0);// 獲取音樂名musicName = app.getMusicList().get(position).getMusicName();// 設(shè)置音樂名標簽內(nèi)容,去掉路徑和擴展名,添加序號tvMusicName.setText("No." + (app.getCurrentMusicIndex() + 1) + "" + musicName.substring(musicName.lastIndexOf("/") + 1, musicName.lastIndexOf(".")));//創(chuàng)建意圖Intent intent = new Intent();//設(shè)置廣播頻道:播放intent.setAction(INTENT_ACTION_PLAY);//按意圖發(fā)送廣播sendBroadcast(intent);}});// 給播放模式單選按鈕組注冊監(jiān)聽器rgPlayMode.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int checkedId) {// 判斷用戶選擇何種播放模式switch (checkedId) {// 順序播放模式case R.id.rb_order:app.setPlayMode(PLAY_MODE_ORDER);break;// 隨機播放模式case R.id.rb_random:app.setPlayMode(PLAY_MODE_RANDOM);break;// 單曲循環(huán)模式case R.id.rb_loop:app.setPlayMode(PLAY_MODE_LOOP);break;}}});// 給音樂播放拖拽條注冊監(jiān)聽器sbMusicProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {// 判斷進度是否為用戶修改if (fromUser) {// 設(shè)置用戶修改的播放進度app.setProgressChangedByUser(progress);// 創(chuàng)建意圖Intent intent = new Intent();// 設(shè)置廣播頻道:用戶修改播放進度intent.setAction(INTENT_ACTION_USER_CHANGE_PROGRESS);// 按意圖發(fā)送廣播sendBroadcast(intent);}}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}});//創(chuàng)建音樂廣播接收器receiver = new MusicReceiver();//創(chuàng)建意圖過濾器IntentFilter filter = new IntentFilter();//通過意圖過濾器添加廣播頻道filter.addAction(INTENT_ACTION_UPDATE_PROGRESS);//注冊音樂廣播接收器registerReceiver(receiver,filter);}/*** 填充音樂列表異步任務類*/private class FillMusicListTask extends AsyncTask<Void, Integer, Void> {/*** 耗時工作執(zhí)行前*/@Overrideprotected void onPreExecute() {super.onPreExecute();// 顯示掃描音樂進度條pbScanMusic.setVisibility(View.VISIBLE);// 顯示掃描音樂標簽tvScanMusic.setVisibility(View.VISIBLE);}@Overrideprotected Void doInBackground(Void... voids) {// 獲取音樂列表musicList = app.getMusicList();// 故意耗時,要不然掃描太快結(jié)束for (long i = 0; i < 2000000000; i++) {}return null;}/*** 耗時工作執(zhí)行后** @param aVoid*/@Overrideprotected void onPostExecute(Void aVoid) {super.onPostExecute(aVoid);// 隱藏掃描音樂進度條pbScanMusic.setVisibility(View.GONE);// 隱藏掃描音樂標簽tvScanMusic.setVisibility(View.GONE);// 判斷音樂列表是否有元素if (musicList.size() > 0) {// 創(chuàng)建音樂適配器adapter = new MusicAdapter(MainActivity.this, musicList);// 給音樂列表控件設(shè)置適配器lvMusicName.setAdapter(adapter);// 獲取當前要播放的音樂名(默認是音樂播放列表的第一首)musicName = musicList.get(0).getMusicName();// 設(shè)置音樂名標簽內(nèi)容,去掉路徑和擴展名,添加序號tvMusicName.setText("No." + (app.getCurrentMusicIndex() +1)+""+musicName.substring(musicName.lastIndexOf("/")+1,musicName.lastIndexOf(".")));//創(chuàng)建意圖,用于啟動音樂服務Intent intent = new Intent(MainActivity.this, MusicPlayService.class);//按意圖啟動服務startService(intent);} else {// 提示用戶沒有音樂文件Toast.makeText(MainActivity.this, "外置存儲卡上沒有音樂文件!", Toast.LENGTH_SHORT);}}}/*** 音樂廣播接收器*/private class MusicReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent){//獲取廣播頻道String action = intent.getAction();//判斷廣播頻道是否為空if (action != null){//根據(jù)不同廣播頻道執(zhí)行不同操作if(INTENT_ACTION_UPDATE_PROGRESS.equals(action)){//獲取播放時長int duration = intent.getIntExtra(DURATION,0);//獲取播放控制圖標int controLIcon = intent.getIntExtra(CONTROL_ICON,R.drawable.play_button_selector);//計算進度值int progress = app.getCurrentPosition() * 100 / duration;//獲取音樂名musicName = app.getMusicList().get(app.getCurrentMusicIndex()).getMusicName();//設(shè)置正在播放的文件名(去掉擴展名)tvMusicName.setText("No." + (app.getCurrentMusicIndex() +1)+""+musicName.substring(musicName.lastIndexOf("/")+1,musicName.lastIndexOf(".")));//設(shè)置播放進度值標簽tvCurrentPosition.setText(app.getFormatTime(app.getCurrentPosition()));//設(shè)置播放時長標簽tvDuration.setText(app.getFormatTime(duration));// 設(shè)置播放拖拽條的進度值sbMusicProgress.setProgress(progress);//設(shè)置【播放|暫停】按鈕顯示的圖標btnPlayOrPause.setBackgroundResource(controLIcon);}}}}/*** 上一首按鈕單擊事件處理方法** @param view*/public void doPrevious(View view) {//創(chuàng)建意圖Intent intent = new Intent();//設(shè)置廣播頻道intent.setAction(INTENT_ACTION_PREVIOUS);//按意圖發(fā)送廣播sendBroadcast(intent);}/*** 下一首按鈕單擊事件處理方法** @param view*/public void doNext(View view) {//創(chuàng)建意圖Intent intent = new Intent();//設(shè)置廣播頻道intent.setAction(INTENT_ACTION_NEXT);//按意圖發(fā)送廣播sendBroadcast(intent);}/*** 播放|暫停按鈕單擊事件處理方法** @param view*/public void doPlayOrPause(View view) {//創(chuàng)建意圖Intent intent = new Intent();//設(shè)置廣播頻道intent.setAction(INTENT_ACTION_PLAY_OR_PAUSE);//按意圖發(fā)送廣播sendBroadcast(intent);}/*** 銷毀回調(diào)方法*/@Overrideprotected void onDestroy() {super.onDestroy();//停止音樂播放服務stopService(new Intent(MainActivity.this, MusicPlayService.class));//注銷廣播接收器if(receiver != null){unregisterReceiver(receiver);}}}在ui子包里創(chuàng)建SplashScreenActivity(啟動畫面)
package com.zjs.sdcard_music_player_v06.ui;import android.content.Intent; import android.os.Bundle; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView;import androidx.appcompat.app.AppCompatActivity;import com.zjs.sdcard_music_player_v06.R;public class SplashScreenActivity extends AppCompatActivity {private Animation animation;//動畫對象private ImageView ivMusicIcon;//音樂圖標圖像控件@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 利用布局資源文件設(shè)置用戶界面setContentView(R.layout.activity_splash_screen_activity);// 通過資源標識獲得控件實例ivMusicIcon = findViewById(R.id.iv_music_icon);// 加載動畫資源文件,創(chuàng)建動畫對象animation = AnimationUtils.loadAnimation(this, R.anim.animator);// 讓音樂圖標圖像控件啟動動畫ivMusicIcon.startAnimation(animation);// 給動畫對象設(shè)置監(jiān)聽器animation.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {// 啟動主界面startActivity(new Intent(SplashScreenActivity.this, MainActivity.class));// 關(guān)閉啟動界面finish();}@Overridepublic void onAnimationRepeat(Animation animation) {}});}}運行效果
總結(jié)
以上是生活随笔為你收集整理的Android实训日志:基于外部存储的音乐播放器V06的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 租客去世,房东私自拉走遗体怎么办?
- 下一篇: Android实训日志:基于外部存储的音