Java 音频在一分钟后停止录制

Java 音频在一分钟后停止录制,java,android,Java,Android,我正在尝试WebRTC,一切正常,但似乎存在一个问题,即,如果屏幕关闭超过一分钟,音频停止录制,这意味着来自设备的音频停止,直到我再次打开屏幕 我试过什么? 1) 我已尝试设置webSettings.setMediaPlaybackRequireservesture(false)这对问题没有好处 2) 我还尝试在我进行WebRTC的活动中添加一个wakelock,但它也不起作用 以下是清单中声明的权限: <uses-permission android:name="android.perm

我正在尝试WebRTC,一切正常,但似乎存在一个问题,即,如果屏幕关闭超过一分钟,音频停止录制,这意味着来自设备的音频停止,直到我再次打开屏幕

我试过什么?

1) 我已尝试设置
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);
    }
}