上一个版本只完成了音乐播放的功能,此次编写实现了歌单搜索,歌曲选择以及歌曲下载的功能,一些基本功能已经大体完成了,后续也只是一些BUG处理,脚本逻辑完善等等。app及代码下载在我的公众号:For My Future。


ui.layout(<vertical><SearchView id="search" w="*" h="50" marginTop="15"/><ListView id="list" bg="#B0E0E6"/><ListView id="namelist" w="*" h="*"/></vertical>
);

上方搜索框是searchview控件,下方是两个listview。

searchview比input使用起来更麻烦一点,选择它是因为手机用键盘输入时会出现搜索的按钮,如下图红圈标识。第一个listview的功能是根据输入自动推荐相关歌曲名称,类似我们百度输入某些文字后输入框下面出现的一些推荐词条,如下图蓝框。第二个listview就是点击搜索按钮后相关歌曲信息的展示了。

 1.1搜索框功能编写

搜索框样式设置:


ui.search.setIconified( false );
ui.search.setSubmitButtonEnabled(true);
ui.search.setQueryHint( "请输入音乐..." );//搜索的hint

在功能编写之前,首先要声明一个storage,存储获得的音乐rid以及相关信息,方便脚本之间数据的传递。


var storage = storages.create("1216951671");

搜索框事件监听,具体详解见代码注释。

ui.search.setOnQueryTextListener( {onQueryTextChange ( text ) { //监听搜索框内容改变来推荐词条if ( text.length > 0 ) {ui.list.setVisibility( 0 );// ui.list.setFilterText( text );//设置过滤器adapter.getFilter().filter( text );//过滤器与list绑定,具体介绍在后面} else {ui.list.setVisibility( 8 );//不可见ui.list.clearTextFilter();}return true;},onQueryTextSubmit(text){ //点击搜索按键后所触发的事件ui.list.setVisibility( 8 );if(text!=null){threads.start(function(){ //线程访问网络,搜索歌曲let res =http.get("http://search.kuwo.cn/r.s?all="+text+"&ft=music& itemset=web_2021&client=kt&pn=0&rn=30&rformat=json&encoding=utf8")let html=res.body.string().replace(/'/g,'"');//双引号替换单引号let json=JSON.parse(html);for(i=0;i<20;i++){//搜索20首歌,歌曲名字,时间,id,歌手分别放在对应的列表中songnamelists[i]=json.abslist[i].SONGNAME;durationlists[i]=formatSeconds(json.abslist[i].DURATION);//fomatsecond时间戳转化函数,下文会具体介绍musicridlists[i]=json.abslist[i].MUSICRID;artistlists[i]=json.abslist[i].ARTIST; totallists[i]= songnamelists[i].toString()+"\t"+"\t"+ artistlists[i].toString()+"\t"+"\t"+durationlists[i].toString();//相关信息汇总在一个列表中 }})let adapter2 = new ArrayAdapter(context, android.R.layout.simple_expandable_list_item_1, totallists)ui.namelist.setAdapter(adapter2);//listview控件要与adapter绑定ui.namelist.setOnItemClickListener({onItemClick( parent,  view, position,  id){//position为 点击歌曲时的位置media.stopMusic();//let s = adapter.getItem(position);musicrid = musicridlists[position];total = totallists[position];storage.put("musicrid", musicrid);//根据位置取列表中歌曲id及相关信息,storage可存储所选歌曲信息,并发送给音乐播放歌曲界面,实现两个脚本之间传递数据storage.put("total", total);log(storage.get("musicrid"));engines.execScriptFile("界面.js")//启动音乐播放器界面}})}// log(totallists);return true;}
} );

  1.2推荐词条功能编写

首先adapter与一个list进行绑定,后续对列表数据的改动就是通过adapter进行操作的。


strArr = [ "许嵩", "如果当时", "庐州月", "昨夜书", "最伟大的作品", "超市" ,"周杰伦" ];//本地推荐的词条,当然也可以通过网上的词条api进行添加
let adapter = new ArrayAdapter( context, android.R.layout.simple_expandable_list_item_1, strArr );
ui.list.setAdapter( adapter );
ui.list.setTextFilterEnabled( true );//启动过滤v
ui.list.setVisibility( 8 );//一开始不显示ListViewui.list.setOnItemClickListener({//监听list点击onItemClick( parent,  view, position,  id){let s = adapter.getItem(position);ui.search.setQuery(s.toString(),true)}//点击时将词条内容设置到搜索框中
})

    1.3时间戳转化

通过api得到的音乐时长是秒数,所以还要设计函数转化为分秒的格式。


function formatSeconds(value) {let secondTime = parseInt(value);// 秒let minuteTime = 0;// 分let hourTime = 0;// 小时if(secondTime > 60) {//如果秒数大于60,将秒数转换成整数//获取分钟,除以60取整数,得到整数分钟minuteTime = parseInt(secondTime / 60);//获取秒数,秒数取余,得到整数秒数secondTime = parseInt(secondTime % 60);//如果分钟大于60,将分钟转换成小时if(minuteTime > 60) {//获取小时,获取分钟除以60,得到整数小时hourTime = parseInt(minuteTime / 60);//获取小时后取余的分,获取分钟除以60取余的分minuteTime = parseInt(minuteTime % 60);}}let result = "" + parseInt(secondTime) + "秒";if(minuteTime > 0) {result = "" + parseInt(minuteTime) + "分" + result;}if(hourTime > 0) {result = "" + parseInt(hourTime) + "小时" + result;}return result;
}

二.歌曲下载功能musicv2.js文件编写

这个文件就是上一个教程的,再做一些修改即可。播放功能在上一个教程讲解过,故不再赘述。下文详细介绍如何进行下载。

首先创建存储的文件夹,


var dirpath = "/sdcard/下载的音乐/";
files.ensureDir(dirpath);

在这个脚本用storage的功能得到search.js脚本传递过来的音乐的rid和相关信息。

var storage = storages.create("1216951671");
var musicrid = storage.get("musicrid");
var total = storage.get("total")

然后取音乐直链进行播放,


let songurl ="http://antiserver.kuwo.cn/anti.s?type=convert_url&rid="+musicrid+"&format=aac|mp3&response=url";let songurl1 = http.get(songurl);musicurl= songurl1.body.string()PlayMusic();

当点击下载按钮时,根据这个直链进行下载及保存。


ui.down.click(function(){threads.start(function(){let res = http.get(musicurl);files.writeBytes(dirpath+total+".mp3", res.body.bytes());toast("下载成功,打开手机自带音乐播放器即可聆听");media.scanFile(dirpath);//扫描,自动添加到媒体库})})

最后,在手机自带的音乐播放器即可找到下载的文件。

其实app还存在很多问题,比如说音乐重音问题,如果正在听音乐,这时返回重新搜索播放新歌曲,就会有二重音,所以在听音乐界面返回搜索音乐界面的时候一定要去点暂停或者停止按钮,这样才不会造成重音。能用但有缺陷,所以这版的音乐app起名为音乐BUG版。

视频演示地址:
https://b23.tv/CnGOyTU

app下载地址:

https://jianglaishi.lanzout.com/ipLGz08fy4qd
密码:c1bv

代码及更多教程在我的微信公众号For My Future上,欢迎关注!

auto.js制作简易音乐app(二)相关推荐

  1. Auto.js制作短视频app(添加登陆注册界面)

    在b站上看到了一个视频咨询的安卓项目 https://www.bilibili.com/video/BV16Z4y1H7jj?spm_id_from=333.337.search-card.all.c ...

  2. Auto.js制作蓝奏软件库app

    教程简介: 本教程利用抓包工具抓到蓝奏软件分享的接口,添加搜索功能,在ui界面的list控件中显示搜索结果,实现了list的上拉翻页,下拉刷新功能,并提供搜索结果的下载服务.(代码及软件下载地址在文末 ...

  3. HTML制作年历,js制作简易年历完整实例

    本文实例讲述了js制作简易年历的方法.分享给大家供大家参考.具体如下: 今天学习了一下用js来实现年历的制作,顺便复习了一下this的用法,跟选项卡的制作有点差别,新用到了innerHTML,希望自己 ...

  4. 原生js制作简易DOM拾色器实例教程

    本教程的目的是为了帮助初学者更好的掌握DOM和数组相关操作,实例效果如下图所示. 可以看到实例中的拾色器分为三个部分:拾色区域.色系区域.显示颜色区域.先写出这三个部分的html代码,如下所示: &l ...

  5. 【带着canvas去流浪(12)】用Three.js制作简易的MARVEL片头动画(上) #华为云·寻找黑马程序员#

    [摘要] 用three.js实现简易的漫威片头动画 示例代码托管在:http://www.github.com/dashnowords/blogs 一. 大作业说明 通读完上一篇博文中提及的教程,觉得 ...

  6. Auto.js加密解密|快照Snapshot解密|Dex转js|Auto.js庖丁下载|解除APP限制

    Auto.js Pro升级到Ver3.1.0 |整合灵虫功能 增加一种加密方式 Ver3.1.0 更新日志 ☆☆ 解密增强 ☆☆ 增加一种解密方式:兼容方式. 兼容方式:支持Auto.js Pro8. ...

  7. 利用JS制作简易计算器

    目的:利用JS制作一个简易的计算器,能够实现简单四则运算 要求:三个输入框输入值只能是数字,当输入非数字时提示并清空输入框,利用正则表达式:点击按钮实现计算. 话不多说,贴图为上: 看了效果图,下面就 ...

  8. Auto.js Pro 调起APP并跳转至指定页面

    本文仅供学习交流使用,如侵立删 效果: 环境: VS Code Auto.js Pro 7.0.4 雷电4 模拟器 跳转 function openjd() {app.startAcvity({pac ...

  9. Android——一个简单的音乐APP(二)

    一个简单的音乐APP 效果视频 前言 音乐下载 音乐下载效果图 实习步骤&思想 添加到下载队列 单任务下载 多任务下载 音乐下载 获取音乐下载源 创建本地路径 创建目录 开始音乐下载 下载进度 ...

最新文章

  1. 简单自学机器学习理论——正则化和偏置方差的权衡 (Part III )
  2. at24c16如何划分出多个读写区_51单片机向at24c16EPROM写入一个数据每问题,写入多个数据,读出的数据都一样...
  3. 简明python教程txt-Python新手的数据批量处理教程(TXT文件)
  4. c语言中if—else的配对问题
  5. replugin源码解析之replugin-host-gradle(宿主的gradle插件)
  6. 心动的本质是什么_《心动的信号3》:在“烟火气”里嗑糖,素人恋爱究竟有多上头?...
  7. 英伟达RTX 2080 Ti值得买么?深度学习测试来了!
  8. 文字围绕浮动元素的妙用(HTML、CSS)
  9. python工资一般多少-Python就业都有哪些岗位?每个岗位薪资多少?
  10. UDP协议的收发操作
  11. Stm32——keil5项目创建步骤
  12. 一步步学习SPD2010--第八章节--理解工作流(8)--使用Visio映射工作流
  13. 《统计学》第八版贾俊平第四章课后答案Excel
  14. 一次监视雷达行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  15. ubuntu下amd超频工具_AMD CPU怎么超频?AMD锐龙平台内存与CPU超频图文教程
  16. 电容在计算机运用原理,隔直电容的作用及原理 - 全文
  17. python utf 8 mac_Mac python 开发环境一些设置
  18. Erlang公历转农历
  19. 阿里矢量图标(字体图标)使用
  20. 金仓数据库 KingbaseES 插件DBMS_OUTPUT

热门文章

  1. Beosin EOS-IDE 升级用户体验及常见问题答疑
  2. 好东西为什么卖不动,店铺选址开店必读!
  3. 《英雄联盟》首部成人动画全球爆火,尺度有点大啊!
  4. opengl SwapBuffers的等待,虚伪的FPS
  5. HR直言:这几类求职者不会要!
  6. MATLAB机器人仿真:利用Simscape Multibody显示真实三维仿真模型
  7. web编程(三)显示html网页
  8. MIMIC数据库下载的问题
  9. WPF网络图片保存编辑_se7en3_新浪博客
  10. sdif matlab,sdif.dat是什么文件