我的 Android 应用程序需要支持 Android 平台 2.1.x(即 Android API 级别 7)。我需要使用 requestAudioFocus() 和 abandonAudioFocus() 方法在我的应用程序开始播放媒体时暂停其他应用程序(例如音乐)播放,并在我的应用程序停止后恢复它们。
然而,这两个函数仅在 API Level 8 及以上可用。 API 级别 7 的等效功能是什么?或者如何在 API 级别 8 之前执行此操作?
最佳答案
感谢 Christopher (http://stackoverflow.com/questions/1993471/android-can-i-mute-currently-playing-audio-applications),我引用:
Android 上的音频处理在一段时间内会非常糟糕。 API 非常奇怪,文档很少,并且在版本之间不断更改/弃用/中断。甚至 AudioManager 代码中也包含 FIXME。
无论如何,Android 中有多种流类型(音乐、通知、电话等),应用程序应选择合适的一种进行播放。我想大多数 Android 应用程序应该使用音乐/媒体类型 (STREAM_TYPE_MUSIC)。您可以使用 setAudioStreamType 方法在 MediaPlayer 上进行设置。
SDK 确实允许您将单个流类型设置为独奏——导致所有其他流静音——但我不相信您可以识别特定应用程序正在播放的音频并以某种方式暂停/取消暂停它。当有来电时,音乐应用程序通常会使用 PhoneStateListener 暂停自身。
因此,在您的情况下,您可以“借用”MediaPlayer 的电话流,并在播放开始时使用方法调用 AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true),然后在播放时使用 false 取消独奏流或您的 Activity 已完成。
我可以告诉你这是有效的,但我不记得在使用语音调用流时是否还需要将音频模式设置为 MODE_IN_CALL(如下所示:AudioManager.setMode(AudioManager.MODE_IN_CALL))。如果您发现这是必需的,那么您需要确保在播放完成后将模式返回到 MODE_NORMAL,否则每当您按下音量硬键时,它都会说“通话音量”!但是,如果当您确实想改回 MODE_NORMAL 时,您必须检查当时没有发生真正的电话...
也许您可以使用另一种流类型而不是语音通话类型,但我只是根据开发应用程序的经验来说,该应用程序可以使用免提电话或听筒进行音频播放,这需要使用语音通话流。
就像我说的,音频处理并不是特别有趣...;)
关于android - Android API 级别 7 中是否有 requestAudioFocus 的等效函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9227645/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin