let music_url = 'http://music.163.com/song/media/outer/url?id=447925558.mp3';
let res = http.get(music_url);
if (res.statusCode != 200) return toastLog('下载音乐失败');
console.log(res);
files.writeBytes('./npSound.mp3', res.body.bytes());
console.log(files.isFile('./npSound.mp3'));
media.playMusic('./npSound.mp3');
为什么上面代码执行到media.playMusic('./npSound.mp3');时,软件闪退
我将代码按照你的建议修改成:const downloadMusic = () => {
let music_url = 'http://music.163.com/song/media/outer/url?id=447925558.mp3';
let res = http.get(music_url);
if (res.statusCode != 200) return toastLog('下载音乐失败');
files.writeBytes('./npSound.mp3', res.body.bytes());
let absPath = files.path('./npSound.mp3');
if (!files.isFile(absPath)) return toastLog('文件不存在');
try {
media.playMusic(absPath);
} catch (e) {
toastLog('播放异常: ' + e);
}
};但是控制台报错:播放异常: JavaException: com.stardust.pio.UncheckedIOException: java.io.IOException: Prepare failed.: status=0x1
回答
根据代码和知识库内容分析,可能原因及解决方案如下:
-
文件路径问题
media.playMusic
需要有效文件路径,建议使用绝对路径。将:media.playMusic('./npSound.mp3');
改为:
let absPath = files.path('./npSound.mp3'); // 获取绝对路径 media.playMusic(absPath);
-
文件未正确保存
检查files.isFile('./npSound.mp3')
是否返回true
,若未生成文件,可能因权限问题或路径错误。确保脚本有存储权限。 -
音乐格式不支持
网易云音乐的 MP3 链接可能受版权保护或格式异常。尝试用其他公开 MP3 链接测试,例如:let music_url = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';
-
异常未捕获
添加try-catch
捕获异常,定位具体错误:try { media.playMusic(absPath); } catch (e) { toastLog('播放失败: ' + e); }
-
权限问题
确保脚本已获取存储权限,可在脚本开头添加:auto.waitFor();
修改后完整代码示例:
// 文档地址 https://docs.hamibot.com/
let music_url = 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3';
let res = http.get(music_url);
if (res.statusCode != 200) return toastLog('下载音乐失败');
files.writeBytes('./npSound.mp3', res.body.bytes());
let absPath = files.path('./npSound.mp3');
if (!files.isFile(absPath)) return toastLog('文件不存在');
try {
media.playMusic(absPath);
} catch (e) {
toastLog('播放异常: ' + e);
}
若仍闪退,请检查日志输出具体错误信息,或尝试其他音乐链接测试。
补充回答 1
根据错误信息 Prepare failed: status=0x1
,结合知识库内容和实际场景,可能原因及解决方案如下:
原因分析
-
网易云音乐链接限制
网易云音乐的 MP3 链接可能受版权保护或需要特定请求头(如User-Agent
),直接http.get
可能无法正确下载音频数据,导致文件损坏或非标准格式。 -
文件路径或权限问题
虽然使用了files.path()
获取绝对路径,但若脚本运行目录无写入权限,或文件未正确保存,media.playMusic
会因文件无效崩溃。 -
媒体播放器初始化问题
部分设备或系统需提前初始化媒体播放器,或需在主线程执行播放操作。
解决方案
1. 添加请求头模拟浏览器访问
修改 http.get
请求,添加 User-Agent
头以绕过网易云防盗链:
let res = http.get(music_url, {
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
});
2. 使用 SD 卡绝对路径保存文件
确保文件保存到系统可访问的目录(如 /sdcard/
):
let absPath = '/sdcard/npSound.mp3';
files.writeBytes(absPath, res.body.bytes());
3. 检查文件有效性
在播放前验证文件是否存在且非空:
if (!files.isFile(absPath) || files.size(absPath) === 0) {
return toastLog('文件无效或为空');
}
4. 添加权限检查
确保脚本已获取无障碍和存储权限:
auto.waitFor(); // 确保无障碍权限
修改后完整代码示例
// 文档地址 https://docs.hamibot.com/
const downloadMusic = () => {
let music_url = 'http://music.163.com/song/media/outer/url?id=447925558.mp3';
// 添加 User-Agent 头模拟浏览器请求
let res = http.get(music_url, {
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
});
if (res.statusCode != 200) return toastLog('下载音乐失败');
// 保存到 SD 卡绝对路径
let absPath = '/sdcard/npSound.mp3';
files.writeBytes(absPath, res.body.bytes());
// 验证文件有效性
if (!files.isFile(absPath) || files.size(absPath) === 0) {
return toastLog('文件无效或为空');
}
try {
media.playMusic(absPath);
} catch (e) {
toastLog('播放异常: ' + e);
}
};
// 确保无障碍权限
auto.waitFor();
downloadMusic();
其他建议
- 测试其他音乐链接:尝试使用公开 MP3 链接(如 SoundHelix 示例)验证代码逻辑。
- 检查设备兼容性:部分设备需在
media.playMusic
前调用media.init()
初始化媒体服务(如需)。 - 日志调试:通过
console.log(res.body.string())
检查下载内容是否为有效 MP3 数据。
若问题仍未解决,建议替换为其他无版权限制的音乐链接或联系网易云客服确认链接可用性。