简体   繁体   中英

Audio Stops Recording After a Minute

I am trying to do WebRTC, all is working fine but there seems to be an issue, that is, if the screen remains off for more than a minute the audio stops recording, meaning the audio from device stops until I switch the screen on once again .

What I have tried?

1) I have tried setting webSettings.setMediaPlaybackRequiresUserGesture(false); it does no good to the problem.

2) I have also tried adding a wakelock in the activity in which I am doing WebRTC but it also didn't work.

Here are the permissions declared in Manifest:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Here in activity, I am granting permission for the microphone in WebChromeClient :

@Override
public void onPermissionRequest(final PermissionRequest request) {
    request.grant(request.getResources());
}

What I want?

I want to be able to continue call without disrupting the user to turn screen back on again. Please point me in right direction.

Thanks!

Update: I tried loading the WebRTC url in Chrome and the same thing is happening, that is, audio stops recording from my device.

Update 2: Adding log when audio stops coming from the device.

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)

Update 3: Tried initializing WebView in a Foreground Service still same result.

Update 4: Tried a demo call on https://appr.tc/ using Chrome(76.0.3809.132). Observed the same result.

Update 5: Tried a demo call using Firefox and it worked FLAWLESSLY which lets me thinking that is it a Chromium bug?

Update 6: Filled a bug report

Check your Chrome/Android version due to this issue with WebRTC on Android: Issue 513633: WebRTC call in Chrome on Android will be cut off 1 min after screen off

WebRTC is supported by default in Chrome so... it should work.

BTW, if you dont't need WebRtc or want try to implement in a background service...

Interest readings:

1 - recording-when-screen-off

As the post says, keep in mind:

To call:

startForeground();

Use START_STICKY:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
       return START_STICKY;
}

2 - how to implement a recorder

As the post says, keep in mind permissions:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Background services with Apache Cordova

With cordova and a webview you need to use a plugin to run code in background as a service too. Take a look at this link: cordova plugin

Another choice with Cordova is to do your own plugin like this:

custom plugin - background video recorder

Android will automatically destroy your activity on a few minutes after leaving foreground that will cause the audio recording to turn off.

I have working with webrtc on android, if you want to create call and video call with webrtc on Android, I suggest to use native webrtc and implement everything related to webrtc on foreground service. Foreground service will ensure your recorder and camera to keep running event when activity is destroyed.

For reference, here the google sample for implementing webrtc native https://webrtc.googlesource.com/src/+/master/examples/androidapp/src/org/appspot/apprtc

You should work on keeping the screen on in that activity during the call and prevent if from dimming.

Use this:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

and after your call is done:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Obviously, it's no usual task, because all your implementation, it's just a WebView . Which very hard to align with such long living task and lifecycle inside Android. For ex. every VoIP application we did, had services in background, to keep connection alive, with wake locks. This was only one way to ensure about stability of the call.

However, I think you could try to do the same. By managing your WebView work inside Service. For this purpose, you could consider moving some calling logic into another view, and starting new Service and creation new Window . This will ensure your Window will be alive, during all the lifecycle of the Service . Smth like.

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);
    }
}

It is possible that the problem is in battery optimization. The device cleans up the background processes and finds there your audio recording screen working on the background. try to add the app to the list of Battery Best Performance list. Search how to do that on your device.

For my case even important background tasks as accessibility service is forced to stop under that battery optimization algorithm. To allow my service to work all the time, the user should add the app to the whitelist of battery best performance rule.

I hope it can help you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM