问题描述
提问者有一个适用于Android的简短bash脚本,用于检测设备上是否有音频正在播放。在控制台上此脚本可以正常工作,在Tasker中执行却无论如何都会返回“Playing”。因此,需要了解为什么会在这两个环境中产生不同的行为结果。
解决方案
方案1
请注意以下操作注意版本差异及修改前做好备份。
根据提问者的说法,Tasker的问题可能与系统或Tasker本身的不兼容性有关。这里有两个方法尝试解决这个问题:
方法1: 修改脚本以适应Tasker环境
首先确认你的脚本是否正确解析了/proc/asound/card*/pcm*/sub*/status
文件路径中可能出现的特殊情况,例如多个音频子设备的情况。修改后的脚本可能如下所示:
#!/bin/bash
running_count=$(grep -c RUNNING /proc/asound/card*/pcm*/sub*/status)
if [ $running_count -gt 0 ]; then
echo "Playing"
else
echo "Idle"
fi
此方法通过统计文件中RUNNING
实例的数量来改进脚本,确保即使在音频子设备多个时也能准确检测播放状态。
方法2: 利用系统服务dumpsys media.player
另一种解决办法是在Tasker中使用dumpsys media.player
命令来获取当前正在播放的媒体文件信息。修改后的Shell命令可能是:
#!/system/bin/sh
player_status=$(dumpsys media.player | grep -E 'currentSongUri|runningTitle')
if [[ "$player_status" == "" ]]; then
echo "Idle"
else
echo "Playing"
fi
此脚本会检查media.player
服务的输出,看是否存在当前正在播放的内容信息。
方案2: 调试与日志记录
提问者提到使用控制台时遇到未知错误代码。在调试中添加更多详细的log语句可以帮助定位问题所在:
#!/system/bin/sh
echo "开始检测音频状态"
player_status=$(dumpsys media.player | grep -E 'currentSongUri|runningTitle')
if [[ "$player_status" == "" ]]; then
echo "无法获取音频信息,可能提示为:$?"
echo "Idle"
else
echo "Audio is playing, player info: $player_status"
echo "Playing"
fi
通过增加详细的日志输出能够更好地了解Tasker中的具体情况和错误。
方案3:
如果以上尝试都没有解决问题,那么就有可能是Tasker本身的问题。可以试着用不同版本或不同任务来测试上述脚本的行为,或者检查是否有其他第三方插件干扰到当前的任务。
对于以上解决方案,请先备份代码,以免意外的程序中断影响设备功能。此外,在修改任何系统文件之前确保熟悉所有风险和操作细节。在特定情况下,可能需要重新启动设备来使更改生效。
正文完