Звонок из службы переднего плана перестает работать, когда экран выключен

У меня есть следующий код для телефонного звонка:

public static void CallPhoneNumber(this Context context, string phoneNumber)
{
    var uri = Android.Net.Uri.Parse("tel:" + phoneNumber);
    var callIntent = new Intent(Intent.ActionCall, uri);
    callIntent.AddFlags(ActivityFlags.NewTask);
    callIntent.AddFlags(ActivityFlags.FromBackground);
    context.StartActivity(callIntent);
}

Я звоню в работающую службу переднего плана. В основном служба определяет условия (в моем случае местоположение по GPS) и звонит по телефону. Он отлично работал с моим Pixel 2XL и Android 9. Но после обновления до Android 10 я столкнулся с новой проблемой.

Прежде всего, я был вынужден добавить новое разрешение FOREGROUND_SERVICE. Кроме того, служба переднего плана работает должным образом и совершает телефонные звонки - но только когда телефон активен, я имею в виду, что он не находится в спящем режиме, когда экран выключен.

Если экран выключен - сервис работает, я могу отслеживать активность, но не звонит.

adb logcat показывает это предупреждение (первая строка - Info, вторая - Warning):

02-04 20:48:00.923  1315  7951 I ActivityTaskManager: START u0 {act=android.intent.action.CALL dat=tel:xxxxxxxxxxxx flg=0x10000004 cmp=com.android.server.telecom/.components.UserCallActivity} from uid 10174
02-04 20:48:00.924  1315  7951 W ActivityTaskManager: Background activity start [callingPackage: MyApp; callingUid: 10175; isCallingUidForeground: false; isCallingUidPersistentSystemProcess: false; realCallingUid: 10174; isRealCallingUidForeground: false; isRealCallingUidPersistentSystemProcess: false; originatingPendingIntent: null; isBgStartWhitelisted: false; intent: Intent { act=android.intent.action.CALL dat=tel:xxxxxxxxxxxx flg=0x10000004 cmp=com.android.server.telecom/.components.UserCallActivity }; callerApp: ProcessRecord{43f3a72 13957:MyApp/u0a174}]

person Tadas Šukys    schedule 04.02.2020    source источник
comment
Android 10 (уровень API 29) и выше накладывают ограничения на то, когда приложения могут начинать действия, когда приложение работает в фоновом режиме. В целях запуска действий приложение, выполняющее службу переднего плана, по-прежнему считается работающим в фоновом режиме. Таким образом, мы могли бы использовать ConnectionService, который совершает телефонные звонки (VoIP или иначе), и хотим, чтобы эти звонки были интегрированы во встроенное телефонное приложение. Проверьте developer.android.com/reference/android/telecom/.   -  person Lucas Zhang    schedule 05.02.2020
comment
@ LucasZhang-MSFT Спасибо, протестирую предложенное решение - выглядит неплохо. Как я описал в вопросе, телефонный звонок запускается, если телефон находится в активном состоянии - даже если звонок инициируется из фоновой службы. Я подумал - а что, если бы я мог проснуться, тогда позвонил бы в это время, а затем позвонил бы, как я делаю это сейчас. Может ли это быть обходной путь?   -  person Tadas Šukys    schedule 05.02.2020


Ответы (1)


Я думаю, вам стоит обратить внимание на частичную блокировку, чтобы телефон не переходил в спящий режим.

https://developer.android.com/training/scheduling/wakelock

в вашем MainActivity.cs создайте объект WakeLock, а в функции OnCreate настройте wakelock:

private PowerManager.WakeLock wl = null;

protected override void OnCreate(Bundle savedInstanceState)
{
    // ... Your own code here
    PowerManager pmanager = (PowerManager)this.GetSystemService("power");
    wl = pmanager.NewWakeLock(WakeLockFlags.Partial, "myapp_wakelock");
    wl.SetReferenceCounted(false);
    wl.Acquire();
 }

Не забудьте добавить разрешение в свой AndroidManifest.xml:

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

Это решение может работать, но вам нужно проявлять осторожность, потому что для некоторых производителей, если ваше приложение использует много ресурсов, служба переднего плана, отвечающая за состояние, всегда живое ЦП, может быть убита. В некоторых случаях они добавляют режим экономии заряда батареи, и вам нужно отключить его прямо в настройках, чтобы приложение запускалось без проблем.

Надеюсь, это поможет

person PaulCrp    schedule 27.04.2021