『牛角书』鸿蒙开发小小播放器
鸿蒙开发小应用-音乐播放器
话不多说,展示。
第一次进去会申请访问权限,点击“始终允许”
点击“始终允许”后退出一下,再次点击进入该应用会看到一首音乐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);}
『牛角书』鸿蒙开发小小播放器相关推荐
- 『牛角书』基于JS实现的鸿蒙游戏——二十四点纸牌
目录 前言 概述 正式开始 一.创建项目 二.编码 1.项目结构 2.实现思路 3.主要代码块 三.页面及功能展示 1.运算正确 2.运算错误 3.换一批及重置 本人项目仓库链接 前言 相信大家都有玩 ...
- 『牛角书』 开发英汉词典03——调用翻译API,并实现APP功能的实现
系列文章目录 文章目录 系列文章目录 前言 一.选用翻译API接口 二.编写调用API的代码 1.进行权限申请 2.编写调用翻译API的代码 3.异步调用 4.解析API调用结果 5.测试运行APP ...
- 『牛角书』HarmonyOS鸿蒙实战 开发一个简单聊天助手APP
前言 我是通过b站上面老师的讲解,跟着老师编写了一个简单聊天助手app,简答实用,对于刚开始接触鸿蒙的我们来说很有帮助. 创建项目 所用软件为DevEco Studio,点击Create Harmon ...
- 《『若水新闻』客户端开发教程》——01.课程介绍
内容介绍 2011年,若水工作室制作了<Android开发从零开始>系列课程,感谢大家的鼓励和支持.为了进一步提高Android开发培训水平,2012年若水工作室又倾心制作的项目实战视频『 ...
- vueJs开发音乐播放器第二篇(点击歌单跳出详情页)
继上一篇开发音乐播放器歌单列表页 (1.使用router定义跳转链接,2. 使用axios得到音乐第三方数据,并渲染到页面上,3.组件之间传值(props)) 1.接下来使用了vue-router路由 ...
- 【网络收录】基于51单片机开发音乐播放器
[网络收录]基于51单片机开发音乐播放器 本文作者:天析 作者邮箱:2200475850@qq.com 发布时间: Thu, 22 May 2014 18:14:00 +0800 特别声明:本资料来源 ...
- linux 基于qt开发的音乐,Linux下用QT开发音乐播放器.pdf
嵌入式课程设计报告 - Linux 在 下开发音乐播放器 李荣贵 141578 一.概述 按课程要求,在Linux环境下开发了一款简易的音乐播放器软件, Mini 名为 " 音乐播放器&qu ...
- SDK开发mp3播放器
一.概述 mp3播放器软件设计需要硬件平台,硬件仿真器件,软件平台,软件开发底台SDK等等,做起来很麻烦. 先考虑在windows上用SDK开发MP3播放器,源代码开发完成后再向硬件平台转移,可以方便 ...
- 最新AndroidStudio项目实战开发安卓播放器(手机影音)
AndroidStudio项目实战开发安卓播放器(手机影音) 下载地址:百度网盘
最新文章
- Pandas (GeoPandas)笔记:set_index reset_index
- SpringBoot2.0(一):【重磅】Spring Boot 2.0权威发布
- C语言编写带参数的宏编在三个数找最大数
- 进程、线程与任务程序之间的关系
- __I、__O、__IO什么意思和处于keil里面什么位置
- AtCoder Regular Contest 058
- 英文科技写作 · 经验分享 · 讨论合集
- 1250. Sea Burial
- java高级面试篇之redis面试收集总结/62题附答案)
- C语言图书购销管理系统流程图,图书销售管理系统C语言程序报告精选.doc
- 计算机右键管理 已停止工作,管理器停止工作,详细教您怎么解决资源管理器已停止工作...
- FusionCompute架构详解
- BT500-BT1788主观质量评价
- linux海报制作软件,用 OpenOffice.org 3.2 Draw 制作海报
- 揭晓丨易知微吉祥物WEI WEI IP形象设计大赛获奖作品出炉
- debug命令(debug命令的使用)
- 从github上下载文件,文件夹,整个项目
- Error while importing package: Couldn’t decompress package
- Vdbench:解决运行时出现的常见问题记录1
- 【HUI】AccordionMenu 手风琴菜单(基于jQuery)