小编the*_*ldm的帖子

强制关闭后音频继续播放

首先,感谢您对这个伟大的网站,我通过搜索这里回答的问题找到了大量的信息.但是我有一个问题,我只发现了一个(没有答案).

我正在编写一个应用程序,它使用AudioTrack通过耳机插孔循环运行时生成的正弦波(以控制其他电子设备).它以定时间隔(使用Handler.postDelayed)执行此操作,并且它工作正常 - 除非您碰巧强制关闭应用程序.在这种情况下,即使在应用程序本身已经过去之后,正弦波仍在继续播放,而字面上我唯一能做的就是重启手机.

如果应用程序正确关闭,即使它崩溃,声音就会停止.

我试过了:

  • 创建一个onDestroy()方法来停止和释放AudioTrack实例,但不幸的是,它甚至都没有被调用.
  • 为声音循环使用更大的音频缓冲区(希望小缓冲区大小导致错误); 没有不同.
  • 再次启动我的应用程序:现在我有两个正常的正弦波!
  • 完全卸载(!)应用程序:正弦波仍然在那里困扰着我的坟墓.
  • 将手机置于静音模式:没有区别.(我不希望这发生在我的用户身上.)
  • 将媒体音量一直调低,等待15分钟以上:没有区别.
  • 将采样率更改为11,22或44.1 kHz:无差异.
  • 一次又一次地开始和杀死应用程序:我实际上可以通过这种方式让8种不同的不朽正弦波相互干扰.实际上非常酷.:P

我知道在Android上使用任务杀手并不"健康",但很多人仍然这样做,而且我不希望我的用户的手机变成不可阻挡的噪音发生器,以防我的应用程序碰巧挂起并让它的屁股发出声响.

以下是生成正弦波的代码:

int bufSize = (int)(11025.0 / 60.0); // the number of samples needed for a seamless loop at 60Hz
AT = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO,
    AudioFormat.ENCODING_PCM_8BIT, bufSize, AudioTrack.MODE_STATIC);

byte buffer[] = new byte[bufSize];

float angle = 0.0f;
for (int i=0; i < bufSize; i++){
    buffer[i] = (byte)(Math.sin(angle) * 255);
    angle += (float)(2*Math.PI) * 60 / 11025;
}

if (AT.write(buffer, 0, bufSize) != bufSize){ …
Run Code Online (Sandbox Code Playgroud)

audio android taskkill

7
推荐指数
1
解决办法
1783
查看次数

标签 统计

android ×1

audio ×1

taskkill ×1