开发背景:
需求:定时清理杀应用,但是需要判断用户当前是否在播放,如果在播放不能杀应用(暂停状态也属于正在播放)
需要特别考虑三种状态:
1.无论是系统app播放,还是三方app播放,都不能清理;
2.无论是全屏播放,或者是小屏幕播放,都不能清理;
3.无论是播放还是暂停,都不能清理;
方法1:
通过AudioManager,判断当前设备是否正在占用声音播放,来判断是否正在播放;
缺点是:当用户点击暂停后,是不占用Audio资源的,所以无法判断暂停状态;
private boolean isPlaying() {
if (audioManager == null)
audioManager = (AudioManager) this.getSystemService(AUDIO_SERVICE);
Log.i(TAG, "audioManager.isMusicActive() = " + audioManager.isMusicActive());
Log.i(TAG, "audioManager.isLocalOrRemoteMusicActive() = " + audioManager.isLocalOrRemoteMusicActive());
if (audioManager.isMusicActive()) {
return true;
}
if (audioManager.isLocalOrRemoteMusicActive()) {
return true;
}
return false;
}
方法二:
hisi平台在播放视频资源时,在proc/msp/vpss00节点会有视频相关信息写入;
通过读取这个节点,判断当前是否有视频资源正在被占用;
优点:在视频播放暂停状态下可以有效判断
private boolean isPlaying() {
if (AutoClearUtil.isVpss00Empty())
return false;
return true;
}
/**
* 读取proc/msp/vpss00节点的信息
* 当节点信息为空时,播放器没有使用
* 当节点信息不为空,播放器正在使用
* @return
*/
public static boolean isVpss00Empty() {
Process catProcess = null;
BufferedReader mReader = null;
try {
catProcess = Runtime.getRuntime().exec("cat proc/msp/vpss00");
mReader = new BufferedReader(new InputStreamReader(
catProcess.getInputStream()), 1024);
String line = null;
if ((line = mReader.readLine()) != null) {
Log.i(TAG, "cat proc/msp/vpss00 = " + line);
return false;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (mReader != null)
mReader.close();
} catch (IOException e) {
e.printStackTrace();
}
if (catProcess != null)
catProcess.destroy();
}
return true;
}