Xamarin.Android приложение вылетает при включенном режиме энергосбережения - PullRequest
0 голосов
/ 31 января 2019

У меня серьезная проблема с режимом энергосбережения на Android.Мое приложение падает, когда включен режим энергосбережения.Проблема проявляется на телефонах Samsung Galaxy (или на любом телефоне / эмуляторе с AOSP или LineageOS), но никогда не возникала на Meizu или Xiaomi (думаю, из-за их собственных оптимизаций батареи; приведенный ниже код всегда возвращает false, но ненезависимо от того, был ли включен режим энергосбережения на этих телефонах).

1-й тест: режим энергосбережения отключен, приложение работает отлично.

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

3-й тест: режим энергосбережения отключен, приложение запущено и свернуто;когда я включаю режим энергосбережения, приложение просит меня добавить себя в белый список;даже если я добавлю приложение в белый список, оно все равно может аварийно завершиться.

4-й тест: режим энергосбережения включен, приложение занесено в белый список;приложение работает частично, зависает или зависает случайным образом.

Я знаю о режиме Doze и включенном разрешении REQUEST_IGNORE_BATTERY_OPTIMIZATIONS в AndroidManifest.xml.Вот мой код, который проверяет, включен ли режим энергосбережения и находится ли приложение в белом списке.Но мое приложение падает до того, как этот код был достигнут (за исключением одной проблемы, которую я описал).

PowerWorker.cs

[assembly: Dependency(typeof(BSWApp.Droid.PowerWorker))]
namespace MyApp.Droid
{
    class PowerWorker : IPowerWorker
    {
        public bool IsInPowerSavingMode()
        {
            PowerManager powerManager = (PowerManager)Application.Context.GetSystemService(Context.PowerService);
            bool isPowerSaveMode = powerManager.IsPowerSaveMode;
            return isPowerSaveMode;
        }

        public bool IsInWhiteList(string packageName)
        {
            PowerManager powerManager = (PowerManager)Application.Context.GetSystemService(Context.PowerService);
            bool isInWhiteList = powerManager.IsIgnoringBatteryOptimizations(packageName);
            return isInWhiteList;
        }

        public void RequestWhiteList(string packageName)
        {
            Application.Context.StartActivity(new Intent(Provider.Settings.ActionRequestIgnoreBatteryOptimizations, Net.Uri.Parse("package:"+packageName)));
        }
    }
}

Logcat с момента сбоя:

01-31 02:31:58.015  1511  1511 E AndroidRuntime: FATAL EXCEPTION: main
01-31 02:31:58.015  1511  1511 E AndroidRuntime: Process: [hidden], PID: 1511
01-31 02:31:58.015  1511  1511 E AndroidRuntime: android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
01-31 02:31:58.015  1511  1511 E AndroidRuntime:   at MyApp.Handlers.MessageHandler+<DisplayConfirmation>d__3.MoveNext () [0x00014] in <bf9ac05a02a44989a618d26fad48d12d>:0
01-31 02:31:58.015  1511  1511 E AndroidRuntime: --- End of stack trace from previous location where exception was thrown ---
01-31 02:31:58.015  1511  1511 E AndroidRuntime:   at MyApp.ViewModels.PowerWorkerViewModel+<LaunchPowerSettings>d__1.MoveNext () [0x0006e] in <bf9ac05a02a44989a618d26fad48d12d>:0
01-31 02:31:58.015  1511  1511 E AndroidRuntime: --- End of stack trace from previous location where exception was thrown ---
01-31 02:31:58.015  1511  1511 E AndroidRuntime:   at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) [0x00000] in <fe08c003e91342eb83df1ca48302ddbb>:0
01-31 02:31:58.015  1511  1511 E AndroidRuntime:   at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <ad2f15102b3a4d36b40e9b0cbc11c376>:0
01-31 02:31:58.015  1511  1511 E AndroidRuntime:   at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <ad2f15102b3a4d36b40e9b0cbc11c376>:0
01-31 02:31:58.015  1511  1511 E AndroidRuntime:   at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <ad2f15102b3a4d36b40e9b0cbc11c376>:0
01-31 02:31:58.015  1511  1511 E AndroidRuntime:   at (wrapper dynamic-method) System.Object.17(intptr,intptr)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at mono.java.lang.RunnableImplementor.n_run(Native Method)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:30)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:751)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:95)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:154)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6077)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
01-31 02:31:58.015  1511  1511 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
01-31 02:31:58.016   534   546 W ActivityManager:   Force finishing activity [hidden]/md5be088b8fe6dd8127a24806968ac5b197.MainActivity

Независимо от того, где я пытаюсь запустить его (я пытался из App.cs (общий код) и из MainActivity.cs (локальный код Android)), я все равно получаю один и тот же результат.Я ожидал, что приложение попросит пользователя добавить приложение в белый список, но на самом деле, даже если пользователь сделал это, это не имеет значения, потому что приложение все равно может аварийно завершить работу, даже если он включен в белый список.Так что я совершенно не понимаю, что делать.

...