您现在的位置是:主页 > news > 网站建设人员招聘/网络营销的核心

网站建设人员招聘/网络营销的核心

admin2025/6/3 7:47:32news

简介网站建设人员招聘,网络营销的核心,三网合一网站建设报价,魅影视频音乐播放器V02: 实现公共目录music的音乐读取 播放读取出的音乐 界面实现进度条和歌曲时长 实现步骤:效果准备工作创建安卓应用拷贝图片素材向DDMS里添加音乐(其实添加一首就可以)创建播放和暂停按钮背景图片选择器activity_main.xml创建包和类在项目清单…

网站建设人员招聘,网络营销的核心,三网合一网站建设报价,魅影视频音乐播放器V02: 实现公共目录music的音乐读取 播放读取出的音乐 界面实现进度条和歌曲时长 实现步骤:效果准备工作创建安卓应用拷贝图片素材向DDMS里添加音乐(其实添加一首就可以)创建播放和暂停按钮背景图片选择器activity_main.xml创建包和类在项目清单…

音乐播放器V02:
实现公共目录music的音乐读取
播放读取出的音乐
界面实现进度条和歌曲时长

实现步骤:

      • 效果
      • 准备工作
        • 创建安卓应用
        • 拷贝图片素材
        • 向DDMS里添加音乐(其实添加一首就可以)
      • 创建播放和暂停按钮背景图片选择器
      • activity_main.xml
      • 创建包和类
      • 在项目清单文件里授权对SD卡的读取权限和设置应用图标
      • CommonUtils.java
      • MainActivity.java
      • 总结

效果

在这里插入图片描述

准备工作

创建安卓应用

在这里插入图片描述

拷贝图片素材

在这里插入图片描述

向DDMS里添加音乐(其实添加一首就可以)

SDK—》tools—》monitor.bat
在这里插入图片描述

创建播放和暂停按钮背景图片选择器

在这里插入图片描述
播放按钮
在这里插入图片描述
暂停按钮
在这里插入图片描述

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"><TextViewandroid:id="@+id/tvMusicName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:textColor="#0000FF"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginBottom="10dp"android:layout_marginTop="10dp"android:gravity="center"><TextViewandroid:id="@+id/TVCurrentPosition"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textColor="#FF0000" /><ProgressBarandroid:id="@+id/pbMusicProgress"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="6"style="?android:attr/progressBarStyleHorizontal" /><TextViewandroid:id="@+id/tvDuration"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:textColor="#FF0000" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center" ><Buttonandroid:id="@+id/btnPlayOrPause"android:layout_width="60dp"android:layout_height="50dp"android:onClick="doPlayOrPause"android:background="@drawable/play_button_selector"/></LinearLayout>
</LinearLayout>

创建包和类

在这里插入图片描述

在项目清单文件里授权对SD卡的读取权限和设置应用图标

在这里插入图片描述

CommonUtils.java

import java.text.SimpleDateFormat;/*** 常用工具类*/
public class CommonUtils {private static SimpleDateFormat sdf = new SimpleDateFormat("mm:ss");/*** 获取格式化时间* @param time* @return*/public static String getFormatTime(int time) {return sdf.format(time);}
}

MainActivity.java

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import net.lj.sdcard_music_player_v02.R;
import net.lj.sdcard_music_player_v02.util.CommonUtils;
import java.io.File;
import java.io.IOException;/*** 基于存储卡的音乐播放器v2.0*/
public class MainActivity extends AppCompatActivity {private MediaPlayer mp;//媒体播放器private File musicDir;//音乐存放目录private String musicName;//音乐文件名private TextView tvMusicName;//音乐名标签private Button btnPlayOrPause;//播放、暂停按钮private int currentPosition;//音乐当前的播放位置private TextView tvCurrentPosition;//显示当前播放位置的标签private TextView tvDuration;//显示音乐播放时长的标签private ProgressBar pbMusicProgress;//音乐播放进度条private Thread thread;//线程private Handler handler;//异步消息处理器private boolean isRunning;//线程循环控制变量@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//利用布局资源设置用户界面setContentView(R.layout.activity_main);//通过资源标识符获取控件实例tvMusicName = findViewById(R.id.tvMusicName);btnPlayOrPause = findViewById(R.id.btnPlayOrPause);tvCurrentPosition = findViewById(R.id.TVCurrentPosition);tvDuration = findViewById(R.id.tvDuration);pbMusicProgress = findViewById(R.id.pbMusicProgress);// 定义存储读写权限数组String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};// 检查是否有读权限int permission = ActivityCompat.checkSelfPermission(this, PERMISSIONS_STORAGE[0]);// 如果没有授权,那么就请求写权限if (permission != PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, 0);}//获取音乐存放目录musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);try {//获取音乐文件存放目录里的第一首音乐文件名musicName = musicDir.list()[0];//设置音乐名标签tvMusicName.setText("音乐名:" + musicName.substring(0, musicName.lastIndexOf(".")));} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "存储卡Music目录里没有music音乐文件", Toast.LENGTH_SHORT).show();}//实例化媒体播放器mp = new MediaPlayer();try {//设置播放源(完整音乐名=音乐目录+音乐名)mp.setDataSource(musicDir.getAbsolutePath()+"/"+musicName);//缓冲播放源(从存储卡加载到内存)mp.prepare();//设置当前播放位置的标签tvCurrentPosition.setText(CommonUtils.getFormatTime(mp.getCurrentPosition()));//设置音乐播放时长标签tvDuration.setText(CommonUtils.getFormatTime(mp.getDuration()));//设置音乐播放进度条最大值pbMusicProgress.setMax(mp.getDuration());} catch (IOException e) {e.printStackTrace();}//给媒体播放器注册完成监听器mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {//提示用户当前音乐播放完毕Toast.makeText(MainActivity.this, "当前音乐播放完毕", Toast.LENGTH_SHORT).show();//当前播放位置清零currentPosition = 0;//将当前播放位置标签清零tvCurrentPosition.setText(CommonUtils.getFormatTime(currentPosition));//将进度条清零pbMusicProgress.setProgress(currentPosition);//按钮图标由【暂停】变为【播放】btnPlayOrPause.setBackgroundResource(R.drawable.play_button_selector);}});//设置线程循环控制变量为真isRunning = true;//创建子线程,定时发送消息thread = new Thread(new Runnable() {@Overridepublic void run() {while (isRunning) {//向主线程发送消息handler.sendEmptyMessage(0x001);//线程睡眠try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}});//启动子线程thread.start();//创建消息处理器,接收子线程发送的消息handler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);//根据子线程发送的消息进行相应处理if (msg.what == 0x001) {//判断音乐是否在播放if (mp!=null && mp.isPlaying()) {//获取当前播放位置currentPosition = mp.getCurrentPosition();//更新音乐播放进度条的进度pbMusicProgress.setProgress(currentPosition);//更新当前播放位置标签的内容tvCurrentPosition.setText(CommonUtils.getFormatTime(currentPosition));}}}};}/*** 播放方法*/private void play() throws IOException {//重置媒体播放器mp.reset();//设置播放源(完整音乐名=音乐目录+音乐名)mp.setDataSource(musicDir.getAbsolutePath() + "/" + musicName);//缓冲播放源(从存储卡加载到内存)mp.prepare();//定位到暂停时的播放位置mp.seekTo(currentPosition);//启动音乐播放mp.start();//按钮图标由【播放】变为【暂停】btnPlayOrPause.setBackgroundResource(R.drawable.pause_button_selector);}/*** 暂停方法*/private void pause() {//暂停播放mp.pause();//保存音乐播放的当前进度currentPosition = mp.getCurrentPosition();//按钮图标由【暂停】变为【播放】btnPlayOrPause.setBackgroundResource(R.drawable.play_button_selector);}/*** 播放或暂停方法* @param view* @throws IOException*/public void doPlayOrPause(View view) throws IOException {//判断音乐是否在播放if (mp.isPlaying()) {//暂停音乐pause();} else {//播放音乐play();}}/*** 销毁回调方法,释放资源*/@Overrideprotected void onDestroy() {super.onDestroy();//停止线程isRunning = false;//销毁线程thread = null;//判断音乐是否在播放if (mp.isPlaying()) {mp.stop();}//释放媒体播放器mp.release();//销毁媒体播放器mp = null;}
}

总结

相比于V01版本,V02版本就是在固有基础上添加了进度条和音乐时长标签。整个程序拆开理解倒也还好,但一连在一起就变得有些困难,主要是内容有点多记不住。