鸿蒙开发小应用-音乐播放器

话不多说,展示。
第一次进去会申请访问权限,点击“始终允许”

点击“始终允许”后退出一下,再次点击进入该应用会看到一首音乐Dream it Possible,因为模拟器上只有这一首主题曲,可以点击播放。

播放器内容包括:播放器名称,音乐名,音乐作曲家,背景图,三个控制播放/暂停,上一曲/下一曲的按钮。

开发导图

一:资源获取

权限申请

    @Overridepublic void onStart(Intent intent) {super.onStart(intent);super.setMainRoute(MainAbilitySlice.class.getName());if (verifySelfPermission("ohos.permission.READ_MEDIA") != IBundleManager.PERMISSION_GRANTED) {if (canRequestPermission("ohos.permission.READ_MEDIA")) {// 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)requestPermissionsFromUser(new String[]{"ohos.permission.READ_MEDIA"}, MY_PERMISSIONS_REQUEST_RW);} else {new ToastDialog(this).setText("需要授予应用读取存储权限").setAlignment(LayoutAlignment.CENTER).show();}}}

当权限可以申请时需要重写下面的方法,获取权限申请的结果

 @Overridepublic void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {if (requestCode == MY_PERMISSIONS_REQUEST_RW) {// 匹配requestPermissions的requestCodeif (grantResults.length > 0&& grantResults[0] == IBundleManager.PERMISSION_GRANTED) {new ToastDialog(this).setText("所有权限已经被授予").setAlignment(LayoutAlignment.CENTER).show();} else {new ToastDialog(this).setText("所有权限已经被拒绝").setAlignment(LayoutAlignment.CENTER).show();}}}

数据模型

一个音乐的实体类

public class MusicBean {private int id;private String title;private String song;private String data;private String duration;private String artist;private String album;构造方法,get,set方法省略}

数据读取

数据读取需要做两件事1.通过访问外部存储的URL获取ResultSet

    private ResultSet queryAvStore(Context context) {ResultSet resultSet = null;DataAbilityHelper helper = DataAbilityHelper.creator(context);try {resultSet = helper.query(AVStorage.Audio.Media.EXTERNAL_DATA_ABILITY_URI, null, null);} catch (DataAbilityRemoteException e) {e.printStackTrace();}return resultSet;}

2.通过ResultSet获取到数据

private List<MusicBean> getMusicBeanList(Context context) {ResultSet resultSet = queryAvStore(context);List<MusicBean> musicBeans = new ArrayList<>();while (resultSet.goToNextRow()) {MusicBean musicBean = new MusicBean();musicBean.setId(resultSet.getInt(resultSet.getColumnIndexForName(AVStorage.AVBaseColumns.ID)));musicBean.setData(resultSet.getString(resultSet.getColumnIndexForName(AVStorage.AVBaseColumns.DATA)));musicBean.setTitle(resultSet.getString(resultSet.getColumnIndexForName(AVStorage.AVBaseColumns.TITLE)));musicBean.setDuration(new SimpleDateFormat("mm:ss").format(new Date(resultSet.getLong(resultSet.getColumnIndexForName(AVStorage.AVBaseColumns.DURATION)))));musicBean.setSong(resultSet.getString(resultSet.getColumnIndexForName(AVStorage.AVBaseColumns.DISPLAY_NAME)));musicBean.setArtist(resultSet.getString(resultSet.getColumnIndexForName("artist")));musicBean.setAlbum(resultSet.getString(resultSet.getColumnIndexForName("album")));musicBeans.add(musicBean);}return musicBeans;}

二:UI界面

布局

<DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:width="match_parent"ohos:height="match_parent"ohos:orientation="vertical"><ListContainerohos:id="$+id:music_bean_lc"ohos:height="0vp"ohos:width="match_parent"ohos:orientation="vertical"ohos:weight="1"ohos:background_element="$media:background"/><DirectionalLayoutohos:height="match_content"ohos:width="match_parent"ohos:background_element="#E6000000"ohos:orientation="horizontal"ohos:padding="5vp"><DirectionalLayoutohos:height="match_content"ohos:width="0vp"ohos:weight="1"ohos:orientation="vertical"ohos:layout_alignment="vertical_center"><Textohos:id="$+id:bottom_music_name_tv"ohos:height="match_content"ohos:width="match_content"ohos:text="$string:music_name"ohos:text_size="20fp"ohos:text_color="$color:color_white"/><Textohos:id="$+id:bottom_music_artists_tv"ohos:height="match_content"ohos:width="match_content"ohos:text="$string:music_artist"ohos:text_size="10fp"ohos:text_color="$color:color_white"/></DirectionalLayout><Buttonohos:id="$+id:bottom_last_btn"ohos:height="50vp"ohos:width="50vp"ohos:margin="10vp"ohos:background_element="$graphic:ic_last"/><Buttonohos:id="$+id:bottom_play_btn"ohos:height="50vp"ohos:width="50vp"ohos:margin="10vp"ohos:background_element="$graphic:ic_play"/><Buttonohos:id="$+id:bottom_next_btn"ohos:height="50vp"ohos:width="50vp"ohos:margin="10vp"ohos:background_element="$graphic:ic_next"/></DirectionalLayout>
</DirectionalLayout>

ListContainer

@Overridepublic int getCount() {return list == null ? 0 : list.size();}@Overridepublic Object getItem(int position) {if (list != null && position >= 0 && position < list.size()) {return list.get(position);}return null;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic Component getComponent(int i, Component component, ComponentContainer componentContainer) {final Component cpt;if (component == null) {cpt = LayoutScatter.getInstance(abilitySlice).parse(ResourceTable.Layout_item_music_bean, null, false);} else {cpt = component;}MusicBean musicBean = list.get(i);Text nameTv = (Text) cpt.findComponentById(ResourceTable.Id_music_name_tv);nameTv.setText(musicBean.getTitle());
//        Text dataTv = (Text) cpt.findComponentById(ResourceTable.Id_music_data_tv);
//        dataTv.setText(musicBean.getSong());Text durationTv = (Text) cpt.findComponentById(ResourceTable.Id_music_duration_tv);durationTv.setText(musicBean.getDuration());Text artistTv = (Text) cpt.findComponentById(ResourceTable.Id_music_artists_tv);artistTv.setText(musicBean.getArtist() + "-" + musicBean.getAlbum());return cpt;}
}

三: 播放逻辑

List Item点击事件

    private void initListContainer() {ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_music_bean_lc);list = getMusicBeanList(this);MusicBeanProvider musicBeanProvider = new MusicBeanProvider(list, this);listContainer.setItemProvider(musicBeanProvider);listContainer.setItemClickedListener((listContainer1, component, i, l) -> {MusicBean item = (MusicBean) listContainer1.getItemProvider().getItem(i);currentPlayMusicPos = i;musicNameTv.setText(item.getTitle());musicArtistTv.setText(item.getArtist()+"-"+item.getAlbum());playBtn.setBackground(new VectorElement(this,ResourceTable.Graphic_ic_pause));try {if (PlayManager.getInstance().play(new Source(DataAbilityHelper.creator(component.getContext()).openFile(Uri.appendEncodedPathToUri(AVStorage.Audio.Media.EXTERNAL_DATA_ABILITY_URI, String.valueOf(item.getId())), "r")),0)) {HiLog.info(hiLogLabel, "播放成功");} else {HiLog.info(hiLogLabel, "播放失败");}} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();HiLog.info(hiLogLabel, "播放失败");}});}

更新底部播放栏的信息,依据音频播成开发指导创建播放服务管埋PlayManager方法类,并在其内部音乐播放、香停、饮复等功能,以便在
Abilityslice中的调用。

底部控制栏

private int currentPlayMusicPos = -1;

当前播放索引为-1表示没有音乐在播放

private void playMusic(Context context){if(currentPlayMusicPos == -1){new ToastDialog(context).setText("请从播放列表中选择歌曲").setAlignment(LayoutAlignment.CENTER).show();}else{if(PlayManager.getInstance().isPlaying()){PlayManager.getInstance().pause();playBtn.setBackground(new VectorElement(this,ResourceTable.Graphic_ic_play));}else{MusicBean item = list.get(currentPlayMusicPos);play(item,context,PlayManager.getInstance().getAudioCurrentPosition());}}}private void nextMusic(Context context){currentPlayMusicPos++;if (currentPlayMusicPos >= list.size()) {currentPlayMusicPos = 0;}MusicBean item = list.get(currentPlayMusicPos);play(item,context,0);}private void lastMusic(Context context){currentPlayMusicPos--;if (currentPlayMusicPos < 0) {currentPlayMusicPos = list.size() - 1;}MusicBean item = list.get(currentPlayMusicPos);play(item,context,0);}

『牛角书』鸿蒙开发小小播放器相关推荐

  1. 『牛角书』基于JS实现的鸿蒙游戏——二十四点纸牌

    目录 前言 概述 正式开始 一.创建项目 二.编码 1.项目结构 2.实现思路 3.主要代码块 三.页面及功能展示 1.运算正确 2.运算错误 3.换一批及重置 本人项目仓库链接 前言 相信大家都有玩 ...

  2. 『牛角书』 开发英汉词典03——调用翻译API,并实现APP功能的实现

    系列文章目录 文章目录 系列文章目录 前言 一.选用翻译API接口 二.编写调用API的代码 1.进行权限申请 2.编写调用翻译API的代码 3.异步调用 4.解析API调用结果 5.测试运行APP ...

  3. 『牛角书』HarmonyOS鸿蒙实战 开发一个简单聊天助手APP

    前言 我是通过b站上面老师的讲解,跟着老师编写了一个简单聊天助手app,简答实用,对于刚开始接触鸿蒙的我们来说很有帮助. 创建项目 所用软件为DevEco Studio,点击Create Harmon ...

  4. 《『若水新闻』客户端开发教程》——01.课程介绍

    内容介绍 2011年,若水工作室制作了<Android开发从零开始>系列课程,感谢大家的鼓励和支持.为了进一步提高Android开发培训水平,2012年若水工作室又倾心制作的项目实战视频『 ...

  5. vueJs开发音乐播放器第二篇(点击歌单跳出详情页)

    继上一篇开发音乐播放器歌单列表页 (1.使用router定义跳转链接,2. 使用axios得到音乐第三方数据,并渲染到页面上,3.组件之间传值(props)) 1.接下来使用了vue-router路由 ...

  6. 【网络收录】基于51单片机开发音乐播放器

    [网络收录]基于51单片机开发音乐播放器 本文作者:天析 作者邮箱:2200475850@qq.com 发布时间: Thu, 22 May 2014 18:14:00 +0800 特别声明:本资料来源 ...

  7. linux 基于qt开发的音乐,Linux下用QT开发音乐播放器.pdf

    嵌入式课程设计报告 - Linux 在 下开发音乐播放器 李荣贵 141578 一.概述 按课程要求,在Linux环境下开发了一款简易的音乐播放器软件, Mini 名为 " 音乐播放器&qu ...

  8. SDK开发mp3播放器

    一.概述 mp3播放器软件设计需要硬件平台,硬件仿真器件,软件平台,软件开发底台SDK等等,做起来很麻烦. 先考虑在windows上用SDK开发MP3播放器,源代码开发完成后再向硬件平台转移,可以方便 ...

  9. 最新AndroidStudio项目实战开发安卓播放器(手机影音)

    AndroidStudio项目实战开发安卓播放器(手机影音) 下载地址:百度网盘

最新文章

  1. Pandas (GeoPandas)笔记:set_index reset_index
  2. SpringBoot2.0(一):【重磅】Spring Boot 2.0权威发布
  3. C语言编写带参数的宏编在三个数找最大数
  4. 进程、线程与任务程序之间的关系
  5. __I、__O、__IO什么意思和处于keil里面什么位置
  6. AtCoder Regular Contest 058
  7. 英文科技写作 · 经验分享 · 讨论合集
  8. 1250. Sea Burial
  9. java高级面试篇之redis面试收集总结/62题附答案)
  10. C语言图书购销管理系统流程图,图书销售管理系统C语言程序报告精选.doc
  11. 计算机右键管理 已停止工作,管理器停止工作,详细教您怎么解决资源管理器已停止工作...
  12. FusionCompute架构详解
  13. BT500-BT1788主观质量评价
  14. linux海报制作软件,用 OpenOffice.org 3.2 Draw 制作海报
  15. 揭晓丨易知微吉祥物WEI WEI IP形象设计大赛获奖作品出炉
  16. debug命令(debug命令的使用)
  17. 从github上下载文件,文件夹,整个项目
  18. Error while importing package: Couldn’t decompress package
  19. Vdbench:解决运行时出现的常见问题记录1
  20. 【HUI】AccordionMenu 手风琴菜单(基于jQuery)

热门文章

  1. DHCP option43配置方法
  2. 健身管理系统 健身房管理系统集成方案
  3. 阿里巴巴开发手册解析个人笔记(六)工程结构
  4. 人间,除了生死,一切都不是事
  5. {}怎样进行邮件推广
  6. 【软件测试】软件测试的定义、软件测试的目的
  7. 单细胞数据库推荐 | TEDD:人和模式动物组织器官发育单细胞转录组与染色质可及性数据库
  8. OpenSSL密码库算法笔记——第4.1.1章 平方和算法
  9. 【数值计算】数值解析--n元一次联立方程组:直接解法
  10. xe5 android 模拟器,Delphi xe5如何使用Bluestacks模拟器。