首先,感谢您提供这个很棒的网站,我通过搜索此处回答的问题找到了大量信息。不过,我有一个问题,我只找到了一个提及(没有答案)。
我正在编写一个应用程序,它使用 AudioTrack 通过耳机插孔循环运行时生成的正弦波(以控制其他电子设备)。它以定时间隔执行此操作(使用 Handler.postDelayed),并且工作正常 - 除非您碰巧强行关闭应用程序。在这种情况下,即使应用程序本身早已消失,正弦波仍会继续播放,实际上我唯一能做的就是重启手机。
如果应用程序正确关闭,即使它崩溃了,声音也会停止。
我试过:
我知道在 Android 上使用任务 killer 并不“健康”,但很多人仍然这样做,我不希望我的用户的手机成为无法阻止的噪音发生器,以防我的应用程序挂起并获得它屁股呐喊。
下面是生成正弦波的代码:
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){
log("Error: Couldn't write audio buffer!");
} else {
AT.setLoopPoints(0, bufSize, -1);
AT.play();
}
尽管我很确定这个错误存在于 Android 本身,但我一直在拼命寻找一种方法来检测强制关闭,以便运行最后一行代码来阻止这种情况在我的应用死机之前发生。我没有找到任何解决方案,尽管我知道这在某种程度上是可能的(我有一个邪恶的警报应用程序,即使你用任务 killer 杀死它也会恢复生机)。如果有人能赐教,我将不胜感激!
我还注意到,当我的应用程序在后台运行并且我返回到它(从“最近的应用程序”菜单或通过任何其他方式)时,似乎每次都创建了一个新实例。这意味着你无法阻止另一个实例在后台播放 - 除非你使用任务 killer ......我确定这一定是我犯的一些微不足道的初学者错误,但我想知道它是否可能相关到死亡的正弦波。
在 Xperia X10 mini pro 上运行 Android 2.1.1。
最佳答案
Even though I'm pretty sure this bug is in Android itself
看起来确实如此。我有没有机会说服你发布一个完整的项目来证明这个问题?另外,您在哪些 Android 操作系统版本上试用过此功能?
I have been desperately searching for a way to detect a force close in order to run one last line of code to stop this from happening before my app dies.
根据定义,这是不可能的。
I've found no solution, even though I know this is possible somehow
不,不是。
(I have an evil alarm app that comes back to life even if you kill it with a task killer).
这并不意味着被强制关闭的“邪恶警报应用”实例发现了事实。这意味着“邪恶的警报应用程序”正在使用其他技术在它已经死亡的事实之后并开始一个新的副本。而且,即使您自己尝试这样做,正如您所指出的那样,也无济于事——您得到的最好结果就是“8 种不同的不朽正弦波”场景。
I've also noticed that when my app is running in the background
您为什么要费心编写一个服务来播放正弦波?我可以看到当你的 Activity 在前台时播放它,但你应该在 onPause() 中停止正弦波,所以当你不在前台时,噪音会停止。
and I return to it (from the "recent apps" menu or through any other way), it seems as if a new instance is created each time
根据“在后台运行”的含义以及您如何进入“后台”,这是正常的。例如,按下 BACK 按钮将销毁 Activity ;以任何方式返回它都会创建一个新的 Activity 实例。
关于android - 强制关闭后音频继续播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6563280/
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11
我想学习一些关于Continuation的知识,使用callcc方法从一些文章中键入几个示例,但我遇到了错误:NoMethodError:undefinedmethod`callcc'formain:Objectfrom(pry):2:in`'没有文章提到包含延续库。那么如何解决这个问题呢?谢谢编辑:ruby1.9.2p290(2011-07-09修订版32553)[x86_64-linux] 最佳答案 您需要要求“继续”。require'continuation' 关于ruby-继续,
运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
一段时间以来,我一直在使用open_uri下拉ftp路径作为数据源,但突然发现我几乎连续不断地收到“530抱歉,允许的最大客户端数(95)已经连接。”我不确定我的代码是否有问题,或者是否是其他人在访问服务器,不幸的是,我无法真正确定谁有问题。本质上,我正在读取FTPURI:defself.read_uri(uri)beginuri=open(uri).readuri=="Error"?nil:urirescueOpenURI::HTTPErrornilendend我猜我需要在这里添加一些额外的错误处理代码...我想确保我采取一切预防措施来关闭所有连接,这样我的连接就不是问题所在,但是我
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我要下载http://foobar.com/song.mp3作为song.mp3,而不是让Chrome在其native中打开它浏览器中的播放器。我怎样才能做到这一点? 最佳答案 您只需要确保发送这些header:Content-Disposition:attachment;filename=song.mp3;Content-Type:application/octet-streamContent-Transfer-Encoding:binarysend_file方法为您完成:get'/:file'do|file|file=File.
使用ruby的watir测试网络应用程序时,浏览器最后会保持打开状态。网上的一些建议是,要进行真正的单元测试,您应该在每次测试时(在拆卸调用中)打开和关闭浏览器,但这很慢而且毫无意义。或者他们做这样的事情:defself.suites=superdefs.afterClass#Closebrowserenddefs.run(*args)superafterClassendsend但这会导致摘要输出不再显示(诸如“100次测试、100次断言、0次失败、0次错误”之类的内容仍应显示)。我怎样才能让ruby或watir在我的测试结束时关闭浏览器? 最佳答案
我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。