Java 音频在一分钟后停止录制
我正在尝试WebRTC,一切正常,但似乎存在一个问题,即,如果屏幕关闭超过一分钟,音频停止录制,这意味着来自设备的音频停止,直到我再次打开屏幕 我试过什么? 1) 我已尝试设置Java 音频在一分钟后停止录制,java,android,Java,Android,我正在尝试WebRTC,一切正常,但似乎存在一个问题,即,如果屏幕关闭超过一分钟,音频停止录制,这意味着来自设备的音频停止,直到我再次打开屏幕 我试过什么? 1) 我已尝试设置webSettings.setMediaPlaybackRequireservesture(false)这对问题没有好处 2) 我还尝试在我进行WebRTC的活动中添加一个wakelock,但它也不起作用 以下是清单中声明的权限: <uses-permission android:name="android.perm
webSettings.setMediaPlaybackRequireservesture(false)代码>这对问题没有好处
2) 我还尝试在我进行WebRTC的活动中添加一个wakelock
,但它也不起作用
以下是清单中声明的权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
我想要什么?
我希望能够在不中断用户再次打开屏幕的情况下继续通话。请给我指出正确的方向
谢谢
更新:我尝试在Chrome中加载WebRTC url,但同样的情况也发生了,即音频停止从我的设备录制
更新2:当设备停止发送音频时添加日志
2019-08-06 17:18:47.266 4332-22405/? V/APM_AudioPolicyManager: getAudioPolicyConfig: audioParam;outDevice
2019-08-06 17:18:47.266 4332-22405/? V/APM_AudioPolicyManager: getNewOutputDevice() selected device 2
2019-08-06 17:18:47.266 4332-22405/? V/APM_AudioPolicyManager: ### curdevice : 2
2019-08-06 17:18:47.307 4332-22405/? V/APM_AudioPolicyManager: AudioPolicyManager:setRecordSilenced(uid:99066, silenced:1)
2019-08-06 17:18:47.308 4332-22405/? V/APM_AudioPolicyManager: AudioPolicyManager:setRecordSilenced(uid:11556, silenced:1)
更新3:尝试在前台服务中初始化WebView
,结果仍然相同
更新4:尝试使用Chrome(76.0.3809.132)进行演示调用。观察到同样的结果
更新5:使用Firefox尝试了一个演示调用,它工作得非常完美,这让我觉得这是一个Chromium bug吗
更新6:由于Android上的WebRTC出现此问题,请检查您的Chrome/Android版本:
默认情况下,Chrome支持WebRTC,因此。。。它应该会起作用
顺便说一句,如果你不需要WebRtc或者想尝试在后台服务中实现
兴趣读物:
1-
正如《华盛顿邮报》所说,请记住:
致电:
startForeground();
使用“开始”按钮:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
2-
正如帖子所说,请记住权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
使用Apache Cordova的后台服务
使用cordova和webview,您也需要使用插件在后台作为服务运行代码。
请查看此链接:
Cordova的另一个选择是制作您自己的插件,如下所示:
离开前台几分钟后,Android将自动销毁您的活动,这将导致音频录制关闭
我曾在android上与webrtc合作,如果您想在android上与webrtc创建呼叫和视频呼叫,我建议使用本机webrtc并在前台服务上实现与webrtc相关的一切。前台服务将确保您的录像机和摄像机在活动被破坏时继续运行
以下是用于实现webrtc本机的google示例,以供参考
在通话过程中,您应该在该活动中保持屏幕打开,并防止if变暗
使用以下命令:
getWindow().addFlags(WindowManager.LayoutParams.FLAG\u保持屏幕打开)代码>
通话结束后:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG\u保持屏幕打开)代码>显然,这不是通常的任务,因为在所有的实现中,它只是一个WebView
。这很难与安卓系统中如此长寿命的任务和生命周期保持一致。例如,我们所做的每个VoIP
应用程序都在后台提供服务,以保持连接的活跃性,并带有唤醒锁。这只是确保通话稳定性的唯一方法
然而,我认为你也可以尝试这样做。通过管理您的WebView
内部服务。为此,您可以考虑将一些调用逻辑移动到另一个视图中,并启动新的<代码>服务< /代码>并创建新的<代码>窗口< /代码>。这将确保您的窗口
在服务
的整个生命周期内处于活动状态。
Smth喜欢
public class ServiceWithWebView extends Service {
@Override
public void onCreate() {
super.onCreate();
final WindowManager windowManager = (WindowManager)
getSystemService(WINDOW_SERVICE);
params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
final LinearLayout view = new LinearLayout(this);
view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout
.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
WebView wv = new WebView(this);
wv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout
.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
view.addView(wv);
wv.loadUrl("http://google.com");
windowManager.addView(view, params);
}
}
问题可能出在电池优化方面。该设备会清理后台进程,并发现您的音频录制屏幕在后台工作。尝试将应用程序添加到电池最佳性能列表中。搜索如何在您的设备上执行此操作
在我的例子中,即使是重要的后台任务,如可访问性服务,也必须在电池优化算法下停止。为了让我的服务能够一直工作,用户应该将应用程序添加到电池最佳性能规则的白名单中
我希望它能帮助你。(1)打开“设置”(2)点击“电池”(3)“屏幕锁定后关闭应用程序”(4)向下滚动到“xxxxx”-切换到“不要关闭”@JonGoodwin谢谢你的评论,但我不认为这是一个跨平台的解决方案,因为我的设备(三星Galaxy S9)中缺少此选项多年来,谷歌一直不鼓励一个应用程序控制另一个应用程序的资源(并且只允许那些付费的提供商通过基于内核的呼叫……facebook等)。如果没有严格的限制,或者没有支付谷歌(和致富!),你现在或将来都不能做你想做的事。有很多失败的方法,其中一种是赢钱。@JonGoodwin使用Firefox尝试了WebRTC,效果如预期!!我不知道WebRTC的情况,但您是否尝试过唤醒锁定和wifi锁定?您好,谢谢您的回复。但我正在尝试使用WebView进行调用。嗨@Mustansir,我在帖子中添加了一条注释。。。使用这个cordova插件在后台作为服务运行。你能解释一下吗?问题是我需要显示那个站点上存在的用户控件。我无法在后台运行任何操作。没问题,您的活动可能会暂停并继续,而不仅仅是被销毁。因此,您的录制被中断。您好,我刚刚尝试在服务中运行webview以消除活动元素。我成功地打了一个电话,但同样的事情重复了。声音停止来自设备。很抱歉,但对于此项目,我仅限于使用Webview。我面临此问题。帮我解决这个问题?这会不会在RTC期间长时间消耗大量电池?只在执行呼叫时使用它似乎是唯一的解决方案
public class ServiceWithWebView extends Service {
@Override
public void onCreate() {
super.onCreate();
final WindowManager windowManager = (WindowManager)
getSystemService(WINDOW_SERVICE);
params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
final LinearLayout view = new LinearLayout(this);
view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout
.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
WebView wv = new WebView(this);
wv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout
.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
view.addView(wv);
wv.loadUrl("http://google.com");
windowManager.addView(view, params);
}
}