我似乎无法找到一种方法来了解Android是否插入了耳机.我发现了各种解决方案,但它们似乎总是返回假.唯一似乎正常工作的是a BroadcastReceiver,但这不是我需要的:
我只需要这样的东西
if(headphones plugged in) {
}
Run Code Online (Sandbox Code Playgroud)
有这样的功能吗?它需要一些特殊权限吗?
我整天都在尝试解决此问题,但是没有运气。这是发生的情况:我测试了我的应用程序,它运行良好,然后拔下电话,将应用程序留在后台,几分钟后,它不再启动,必须强制关闭。奇怪的是,插入设备后不会发生此问题:我将其放置在那里连续2个小时即可正常工作,然后拔出电源,并在5分钟后冻结了该应用程序。我怀疑这与手机进入深度睡眠有关(为了确定,我将尝试使用唤醒锁)。当我插上电话并查看logcat时,我看到的只是警告,该应用程序必须被强制关闭,并且此可疑的外观是:
活动已报告停止,但不再停止
这是什么意思?我没有停止活动,它在后台运行,也没有被系统杀死,因为当这种情况发生时,应用程序不会冻结,它会被杀死,必须重新启动。
我以前从未遇到过这个问题,并且在互联网上找不到关于此问题的任何信息:您是否遇到过类似的事情?我该怎么办?
我正在尝试使用AudioTrack类播放合成声音(基本上是2个正弦波和一些噪声).它似乎与javax.sound.sampled中的SourceDataLine没有任何不同,但合成真的很慢.即使对于ARM标准,认为32768个样本(16位,立体声,总共65536)在Nexus 4上渲染需要1秒钟(用System.nanotime()测量,写入AudioTrack除外)是不现实的.合成部分与此http://audioprograming.wordpress.com/2012/10/18/a-simple-synth-in-android-step-by-step-guide-using-the-java-sdk/几乎完全相同,唯一的区别是我播放立体声(我无法将其降低为单声道,因为它是双耳音).
有任何想法吗?我能做什么?
提前致谢
我有这个方法:
public double sineWave(double t)
{
return amplitude==0?0:Math.sin(t * frequency * Math.PI*2 + phase) * amplitude;
}
Run Code Online (Sandbox Code Playgroud)
它由另一个类中的另一个方法调用,以生成简单正弦波的样本,然后将其添加到缓冲区中以发送到声卡.t是时候了.由于某种原因,应用程序调用此方法越多,它获得的速度就越慢.它没有任何意义,在15秒之后,它足够慢以使用我的CPU的完整核心并使音频断断续续.
我100%肯定这是一段代码,因为如果我用返回0替换它,运行它(测量System.nanotime())所花费的时间是不变的.
为什么会这样?有什么我可以做的来解决这个问题吗?