当前位置: 首页 > news >正文

手机端AIDE安卓音乐播放代码

java代码

packagecom.music.app;/* 手机编程王APP & AIDE编译器联合出品 官方微信2133688724 微信公众号:手机编程APP 官网:www.shoujibiancheng.com */importandroid.Manifest;importandroid.content.Intent;importandroid.content.pm.PackageManager;importandroid.media.MediaPlayer;importandroid.net.Uri;importandroid.os.Bundle;importandroid.os.Handler;importandroid.view.View;importandroid.widget.AdapterView;importandroid.widget.ArrayAdapter;importandroid.widget.Button;importandroid.widget.ListView;importandroid.widget.SeekBar;importandroid.widget.Toast;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.app.ActivityCompat;importjava.util.ArrayList;importjava.util.List;publicclassMainActivityextendsAppCompatActivity{// 核心组件(新增选择文件按钮)privateListViewmusicList;// 音乐列表(显示已选音乐)privateSeekBarmusicSeekBar;// 进度条privateButtonplayBtn;// 播放/暂停按钮privateButtonnextBtn;// 下一曲按钮privateButtonselectBtn;// 选择文件按钮privateMediaPlayermediaPlayer;// 音乐播放核心类// 音乐数据存储privateList<String>musicNames=newArrayList<>();// 音乐名称列表privateList<String>musicPaths=newArrayList<>();// 音乐路径列表(Uri字符串形式)privateintcurrentMusicIndex=0;// 当前播放音乐索引privatestaticfinalintFILE_SELECT_REQUEST=101;// 文件选择请求码// 进度条更新 handler(主线程更新UI)privateHandlerseekBarHandler=newHandler();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化组件(新增选择按钮初始化)initView();// 初始化MediaPlayermediaPlayer=newMediaPlayer();}// 初始化UI组件(新增选择文件按钮及点击事件)privatevoidinitView(){musicList=findViewById(R.id.musicList);musicSeekBar=findViewById(R.id.musicSeekBar);playBtn=findViewById(R.id.playBtn);nextBtn=findViewById(R.id.nextBtn);// 新增选择文件按钮(需先修改布局文件,见步骤三)selectBtn=findViewById(R.id.selectBtn);// 选择文件按钮点击事件(打开系统文件管理器)selectBtn.setOnClickListener(v->openFileSelector());// 播放/暂停按钮点击事件(优化判断:无已选音乐时提示选择)playBtn.setOnClickListener(v->{if(musicPaths.isEmpty()){Toast.makeText(this,"请先选择音乐文件",Toast.LENGTH_SHORT).show();return;}if(mediaPlayer.isPlaying()){mediaPlayer.pause();playBtn.setText("播放");}else{playCurrentMusic();playBtn.setText("暂停");}});// 下一曲按钮点击事件(无已选音乐时提示)nextBtn.setOnClickListener(v->{if(musicPaths.isEmpty()){Toast.makeText(this,"请先选择音乐文件",Toast.LENGTH_SHORT).show();return;}currentMusicIndex=(currentMusicIndex+1)%musicPaths.size();playCurrentMusic();});// 进度条拖动事件(跳转音乐进度)musicSeekBar.setOnSeekBarChangeListener(newSeekBar.OnSeekBarChangeListener(){@OverridepublicvoidonProgressChanged(SeekBarseekBar,intprogress,booleanfromUser){if(fromUser&&mediaPlayer.isPlaying()){mediaPlayer.seekTo(progress);}}@OverridepublicvoidonStartTrackingTouch(SeekBarseekBar){}@OverridepublicvoidonStopTrackingTouch(SeekBarseekBar){}});// 音乐列表点击事件(切换播放选中音乐)musicList.setOnItemClickListener((parent,view,position,id)->{currentMusicIndex=position;playCurrentMusic();playBtn.setText("暂停");});}// 打开系统文件选择对话框(仅显示音频文件)privatevoidopenFileSelector(){// 申请读取文件权限(适配低版本Android)if(ActivityCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this,newString[]{Manifest.permission.READ_EXTERNAL_STORAGE},100);return;}// 配置文件选择意图:仅选择音频文件Intentintent=newIntent(Intent.ACTION_GET_CONTENT);intent.setType("audio/*");// 筛选音频格式(所有音频都能选)intent.addCategory(Intent.CATEGORY_OPENABLE);// 允许选择可打开的文件try{// 启动文件选择对话框startActivityForResult(Intent.createChooser(intent,"选择音乐文件"),FILE_SELECT_REQUEST);}catch(Exceptione){Toast.makeText(this,"请安装文件管理器",Toast.LENGTH_SHORT).show();}}// 文件选择结果回调(获取选中文件的Uri)@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if(requestCode==FILE_SELECT_REQUEST&&resultCode==RESULT_OK&&data!=null){// 获取选中文件的Uri(Android 10+推荐用Uri操作文件,无需绝对路径)UriselectedUri=data.getData();if(selectedUri!=null){// 获取文件名(从Uri中提取)StringfileName=selectedUri.getLastPathSegment();// 添加到列表(路径存Uri字符串,名称存文件名)musicPaths.add(selectedUri.toString());musicNames.add(fileName);// 更新列表显示ArrayAdapter<String>adapter=newArrayAdapter<>(this,android.R.layout.simple_list_item_1,musicNames);musicList.setAdapter(adapter);Toast.makeText(this,"已选择:"+fileName,Toast.LENGTH_SHORT).show();}}}// 播放当前索引的音乐(适配Uri播放,替换原路径播放逻辑)privatevoidplayCurrentMusic(){try{// 重置MediaPlayermediaPlayer.reset();// 用Uri设置数据源(适配Android 10+文件权限)mediaPlayer.setDataSource(this,Uri.parse(musicPaths.get(currentMusicIndex)));// 准备播放(同步准备,简单适配)mediaPlayer.prepare();// 开始播放mediaPlayer.start();// 设置进度条最大值(音乐总时长)musicSeekBar.setMax(mediaPlayer.getDuration());// 启动进度条更新updateSeekBar();// 提示当前播放音乐Toast.makeText(this,"正在播放:"+musicNames.get(currentMusicIndex),Toast.LENGTH_SHORT).show();}catch(Exceptione){e.printStackTrace();Toast.makeText(this,"播放失败,请换一个文件试试",Toast.LENGTH_SHORT).show();}}// 实时更新进度条(每500ms更新一次)privatevoidupdateSeekBar(){seekBarHandler.postDelayed(newRunnable(){@Overridepublicvoidrun(){if(mediaPlayer.isPlaying()){intcurrentProgress=mediaPlayer.getCurrentPosition();musicSeekBar.setProgress(currentProgress);updateSeekBar();}}},500);}// 权限申请结果回调(选择文件权限)@OverridepublicvoidonRequestPermissionsResult(intrequestCode,String[]permissions,int[]grantResults){super.onRequestPermissionsResult(requestCode,permissions,grantResults);if(requestCode==100&&grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED){// 权限通过,重新打开文件选择openFileSelector();}else{Toast.makeText(this,"拒绝权限无法选择文件",Toast.LENGTH_SHORT).show();}}// 销毁时释放资源(避免内存泄漏)@OverrideprotectedvoidonDestroy(){super.onDestroy();if(mediaPlayer!=null){mediaPlayer.stop();mediaPlayer.release();mediaPlayer=null;}seekBarHandler.removeCallbacksAndMessages(null);}}Androidmanifest.xml代码<?xml version="1.0"encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.music.app"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="29"android:targetSdkVersion="31"/><!--存储权限(Android10+适配)--><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/><!--音频播放权限--><uses-permission android:name="android.permission.RECORD_AUDIO"/><!--允许后台播放--><uses-permission android:name="android.permission.FOREGROUND_SERVICE"/><!--应用入口Activity--><application android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.MyApplication"><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></application></manifest>activitymain.xml代码<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><!--音乐列表(显示已选音乐)--><ListViewandroid:id="@+id/musicList"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:divider="@android:color/darker_gray"android:dividerHeight="1dp"/><!--进度条--><SeekBarandroid:id="@+id/musicSeekBar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="16dp"/><!--控制按钮(新增选择文件按钮,放最左侧)--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:orientation="horizontal"android:paddingTop="16dp"><Buttonandroid:id="@+id/selectBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="选择文件"/><Buttonandroid:id="@+id/playBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="播放"android:layout_marginStart="20dp"/><Buttonandroid:id="@+id/nextBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="下一曲"android:layout_marginStart="20dp"/></LinearLayout></LinearLayout>
http://www.cnnetsun.cn/news/103344.html

相关文章:

  • 手机端AIDE安卓2进制计算器软件代码
  • NetBox拓扑视图插件终极指南:3分钟实现网络架构可视化
  • RustDesk隐私模式:企业级远程协助的安全革命
  • 如何快速实现Ubuntu全自动部署:终极无人值守安装指南
  • AI绘画控制技术深度解析:ControlNet如何实现精准构图控制
  • 网易云音乐脚本:3大隐藏功能解锁你的音乐自由
  • IDM激活脚本技术深度解析:兼容性重构与性能优化完整指南
  • Minecraft Bedrock启动器技术实现与优化指南
  • MegSpot开源项目完整教程:从入门到精通
  • XposedRimetHelper位置服务功能深度解析:提升钉钉使用体验
  • 深度解锁Windows隐藏功能:ViVeTool GUI使用全攻略
  • 如何快速配置Jellyfin Bangumi插件:新手3分钟上手教程
  • KOReader终极完整指南:免费打造专业级电子书阅读体验
  • VMD-Python分子可视化工具深度解析与实战指南
  • 零基础掌握X-AnyLabeling:GeCO模型目标计数实战全解析
  • Windows界面美化终极指南:DWMBlurGlass实现透明效果全解析
  • 掌握Tianshou:PyTorch强化学习框架从入门到实战
  • 百度网盘秒传链接高效使用指南:从零基础到精通
  • QQ截图独立版:解锁Windows屏幕捕捉新体验的完整手册
  • Emby界面美化完全手册:3种方法打造专属影音中心
  • EmotiVoice语音能量调节功能改善发音力度
  • uvm32一款极简、无依赖的虚拟机沙盒,支持动态加载APP,仅需3KB Flash/1KB RAM
  • Blender版本管理革命:智能化工具如何重塑3D创作工作流
  • 5、Linux 命令使用指南
  • EmotiVoice与动作捕捉结合:打造全感知虚拟人
  • Stable Diffusion WebUI Forge技术架构深度解析:PyTorch生态下的AI绘画引擎
  • 如何快速掌握Grammarly插件:开发者的写作辅助完整指南
  • 5分钟快速上手:yt-dlp-gui 图形界面视频下载终极指南
  • ReadCat电子书阅读器:打造极致纯净的数字阅读体验
  • 韩国掘金必看:Coupang火箭速度背后,跨境卖家的蓝海锚点逻辑