首页 > 其他分享 >『牛角书』基于鸿蒙开发小小音乐播放器

『牛角书』基于鸿蒙开发小小音乐播放器

时间:2022-12-18 12:01:04浏览次数:45  
标签:播放器 牛角 鸿蒙 list resultSet musicBean private ohos new

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

话不多说,展示。

第一次进去会申请访问权限,点击“始终允许”

『牛角书』基于鸿蒙开发小小音乐播放器_Text


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

『牛角书』基于鸿蒙开发小小音乐播放器_Text_02


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

开发导图

一:资源获取

权限申请
@Override
public 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();
}
}
}

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

@Override
public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == MY_PERMISSIONS_REQUEST_RW) {// 匹配requestPermissions的requestCode
if (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界面

布局
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:width="match_parent"
ohos:height="match_parent"
ohos:orientation="vertical">
<ListContainer
ohos:id="$+id:music_bean_lc"
ohos:height="0vp"
ohos:width="match_parent"
ohos:orientation="vertical"
ohos:weight="1"
ohos:background_element="$media:background"/>
<DirectionalLayout
ohos:height="match_content"
ohos:width="match_parent"
ohos:background_element="#E6000000"
ohos:orientation="horizontal"
ohos:padding="5vp">
<DirectionalLayout
ohos:height="match_content"
ohos:width="0vp"
ohos:weight="1"
ohos:orientation="vertical"
ohos:layout_alignment="vertical_center">
<Text
ohos: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"/>
<Text
ohos: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>
<Button
ohos:id="$+id:bottom_last_btn"
ohos:height="50vp"
ohos:width="50vp"
ohos:margin="10vp"
ohos:background_element="$graphic:ic_last"/>
<Button
ohos:id="$+id:bottom_play_btn"
ohos:height="50vp"
ohos:width="50vp"
ohos:margin="10vp"
ohos:background_element="$graphic:ic_play"/>
<Button
ohos:id="$+id:bottom_next_btn"
ohos:height="50vp"
ohos:width="50vp"
ohos:margin="10vp"
ohos:background_element="$graphic:ic_next"/>
</DirectionalLayout>
</DirectionalLayout>

『牛角书』基于鸿蒙开发小小音乐播放器_Text_03

ListContainer
@Override
public int getCount() {
return list == null ? 0 : list.size();
}

@Override
public Object getItem(int position) {
if (list != null && position >= 0 && position < list.size()) {
return list.get(position);
}
return null;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public 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);
}

标签:播放器,牛角,鸿蒙,list,resultSet,musicBean,private,ohos,new
From: https://blog.51cto.com/u_15244322/5950836

相关文章

  • 基于鸿蒙的手写板
    一、前言本着要带着目标去学习的态度,做了一个简易的手写板,使用的语言是JAVA,效果图如下:二、准备工作下载DevEcoStudio,创建一个新项目(鸿蒙2.0)。接着我思考了一下手写......
  • 『牛角书』鸿蒙基础计算器
    简介这是我自己的鸿蒙期末考查大作业,通过一学期课程的学习,研究出来的一些成果,代码还有很多需要优化的地方,本文内容仅为利用组件简单的计算器页面。成果展示开发思路计算器......
  • 小游戏:基于鸿蒙的24点纸牌游戏
    开发设计实现文档 一、编写目的 灵感来源于二十四点纸牌游戏,将生活中的纸牌游戏在电脑网页上实现。学会以后在空闲时可以玩一玩,锻炼一下速算能力。 二、项目目......
  • 网页后台Console 修改网课播放器倍速播放
    F12进入调试页面,在控制台(Console)下输入以下代码回车即可:document.querySelector('video').playbackRate=4.0;可将播放速率更改为4。若需更改为其他播放速率,......
  • 『牛角书』基于HarmonyOS的计算器页面
    @​​toc​简介这里分享的是我自己的鸿蒙期末考查大作业,通过一学期课程的学习,研究出来的一些成果,代码还有很多需要优化的地方,本文内容仅为利用组件形成的计算器页面。成果展......
  • 【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结
    随着新一代信息技术与汽车产业的深度融合,智能网联汽车正逐渐成为汽车产业发展的战略制高点,无论是传统车企还是新势力都瞄准了“智能座舱”这种新一代人机交互方式。面对竞......
  • 【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结
    随着新一代信息技术与汽车产业的深度融合,智能网联汽车正逐渐成为汽车产业发展的战略制高点,无论是传统车企还是新势力都瞄准了“智能座舱”这种新一代人机交互方式。面对竞......
  • 鸿蒙小游戏2048
    DevEcoStudioProjects鸿蒙2048小游戏2048大家应该都玩过,今天我们就来实现一个可以在鸿蒙系统上运行的2048小游戏,大概长下面这样: ​​​​ 在开始写代码之前,我们来分析下,要......
  • 实现一个会动的鸿蒙 LOGO
    本文将带大家简单实现一个会动的鸿蒙LOGO。emmm,写本文的动机是之前在掘金看到一篇实现鸿蒙LOGO的文章--​​产品经理:鸿蒙那个开场动画挺帅的给咱们页面也整一个呗​​......
  • 『牛角书』基于HarmonyOS分布式小游戏之你画我猜
    一、游戏逻辑游戏分为单双人模式单人模式:自画自猜,只需要一个设备即可双人模式:需要两台设备,主设备根据关键字进行绘图,从设备根据主设备的绘图描述猜关键字。从设备猜对则从......