Android 当屏幕关闭时,前台服务的呼叫停止工作
我有以下打电话的代码:Android 当屏幕关闭时,前台服务的呼叫停止工作,android,xamarin,xamarin.android,android-10.0,Android,Xamarin,Xamarin.android,Android 10.0,我有以下打电话的代码: publicstaticvoidcallphonenumber(此上下文上下文,字符串phoneNumber) { var uri=Android.Net.uri.Parse(“电话:”+phoneNumber); var callIntent=newintent(Intent.ActionCall,uri); callIntent.AddFlags(ActivityFlags.NewTask); AddFlags(ActivityFlags.FromBackground
publicstaticvoidcallphonenumber(此上下文上下文,字符串phoneNumber)
{
var uri=Android.Net.uri.Parse(“电话:”+phoneNumber);
var callIntent=newintent(Intent.ActionCall,uri);
callIntent.AddFlags(ActivityFlags.NewTask);
AddFlags(ActivityFlags.FromBackground);
背景。起始触觉(callIntent);
}
我在正在运行的前台服务中打电话。基本上,服务检测条件(在我的例子中是GPS位置)并拨打电话。它与我的像素2XL和安卓9配合得很好。但升级到安卓10后,我遇到了一个新问题
首先,我被迫添加一个新的权限前台服务
。另外,前台服务可以按预期工作并拨打电话——但只有当手机处于“活动”状态时,我的意思是,当屏幕关闭时,它不会处于“睡眠”模式
如果屏幕关闭-服务正常,我可以跟踪活动,但它不会打电话
adb logcat
显示此警告(第一行是Info
,第二行是warning
):
02-04 20:48:00.923 1315 7951 I ActivityTaskManager:START u0{act=android.intent.action.CALL dat=tel:xxxxxxxxxx flg=0x10000004 cmp=com.android.server.telecom/.components.UserCallActivity}来自uid 10174
02-04 20:48:00.924 1315 7951 W活动任务管理器:后台活动开始[callingPackage:MyApp;callingUid:10175;isCallingUidForeground:false;isCallingUidPersistentSystemProcess:false;realCallingUid:10174;isRealCallingUidForeground:false;isRealCallingUidPersistentSystemProcess:false;OriginatingPendingEvent:null;IsBGStartHitelisted:false;intent:intent{act=android.intent.action.CALL dat=tel:xxxxxxxxxxx flg=0x10000004 cmp=com.android.server.telecom/.components.UserCallActivity};callerApp:ProcessRecord{43f3a72 13957:MyApp/u0a174}]
我认为您应该查看“部分唤醒锁定”以防止手机进入“睡眠模式”
在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" />
此解决方案可以工作,但您需要随身携带,因为对于某些制造商来说,如果您的应用程序使用多个资源,则负责CPU“始终处于活动状态”的前台服务可能会被终止。在某些情况下,他们会添加“电池节省器”选项模式,您需要在设置中直接禁用它,以便运行应用程序而不会出现问题
希望这能有所帮助我想你应该看看“部分唤醒锁定”以防止手机进入“睡眠模式” 在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" />
此解决方案可以工作,但您需要随身携带,因为对于某些制造商来说,如果您的应用程序使用多个资源,则负责CPU“始终处于活动状态”的前台服务可能会被终止。在某些情况下,他们会添加“电池节省器”选项模式,您需要在设置中直接禁用它,以便运行应用程序而不会出现问题
希望这可以帮助Android 10(API级别29)和更高的地方限制当应用程序在后台运行时,应用程序何时可以启动活动。为了启动活动,运行前台服务的应用程序仍然被认为是“在后台”。因此,我们可以使用ConnectionService,它可以拨打电话(VoIP或其他)并希望将这些呼叫集成到内置电话应用程序中。请检查。@LucasZhang MSFT谢谢,我将测试建议的解决方案-看起来非常可靠。正如我在问题中所述,如果电话处于“活动”状态,则会触发电话呼叫-即使呼叫是从后台服务触发的。我在想-如果我可以呢“唤醒”然后此时打电话,然后像我现在这样打电话。这可能是一个解决办法吗?Android 10(API级别29)和更高的地方限制,当应用程序在后台运行时,应用程序何时可以启动活动。出于启动活动的目的,运行前台服务的应用程序仍然被认为是”因此,我们可以使用ConnectionService,它可以拨打电话(VoIP或其他方式),并希望这些电话集成到内置的电话应用程序中。请检查。@LucasZhang MSFT谢谢,我将测试建议的解决方案-看起来非常可靠。正如我在问题中所述,如果电话处于“活动”状态,则会触发电话呼叫“状态-即使呼叫是由后台服务触发的。我在想-如果我可以在这个时候“唤醒”然后打电话,然后像现在这样打电话会怎么样。这会是一个解决办法吗?”?