BroadcastReceiver BATTERY_LOW аварийно завершал работу, когда отображалось предупреждение о низком заряде батареи

У меня есть батарея BroadcastReceiver с фильтрами намерений BATTERY_LOW и BATTERY_OKAY, этот приемник работает правильно, но когда отображается предупреждение о низком заряде батареи (процент заряда батареи ниже 15 процентов), приложение вылетает из этого журнала:

12-18 03:13:49.651 1802-1802/E/AndroidRuntime: НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основной процесс: , PID: 1802 java.lang.RuntimeException: невозможно создать экземпляр получателя.BatteryLevelReceiver: java.lang.ClassNotFoundException: не найдено class "receivers.BatteryLevelReceiver" по пути: DexPathList[[zip-файл "/data/app/-1.apk", zip-файл "/data/data//code_cache/secondary-dexes/-1.apk.classes2.zip" , застежка…

BatteryLevelReceiver:

public class BatteryLevelReceiver extends BroadcastReceiver {

    private static final String TAG = BatteryLevelReceiver.class.getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            int curentPercent = getBatteryPercentage(context);
            Log.e(TAG, "getBatteryPercentage: " + curentPercent);

        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public static int getBatteryPercentage(Context context) {

        try {
            if (Build.VERSION.SDK_INT >= 21) {

            BatteryManager bm = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
            return bm.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);

            } else {

                IntentFilter iFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
                Intent batteryStatus = context.registerReceiver(null, iFilter);

                int level = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) : -1;
                int scale = batteryStatus != null ? batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1) : -1;

                double batteryPct = level / (double) scale;

                return (int) (batteryPct * 100);
            }
        }catch(Exception e) {
            e.printStackTrace();
            Log.e(TAG, "getBatteryPercentage: ");
        }
        return 1111;
    }

}

Манифест Android:

<application
        android:name=".AppController"
        android:allowBackup="true"
        android:icon="@mipmap/ic_logo"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network_security_config"
        android:supportsRtl="true"
        android:largeHeap="true"
        android:hardwareAccelerated="true"
        android:theme="@style/AppTheme">

    ...


    <receiver android:name="receivers.BatteryLevelReceiver"
    android:enabled="true"
    android:exported="true">

        <intent-filter>
            <action android:name="android.intent.action.BATTERY_LOW"/>
        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.BATTERY_OKAY"/>
        </intent-filter>

    </receiver>

</application>

Класс приложения:

public class AppController extends MultiDexApplication {

    ...


    @Override
    public void onCreate() {

        super.onCreate();
        MultiDex.install(this);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
}

Грейдл:

apply plugin: 'com.android.application'



apply plugin: 'io.fabric'

android {
    compileSdkVersion 28
    defaultConfig {

        ...

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
            }
        }
        vectorDrawables.useSupportLibrary = true
    }

    dexOptions {
        jumboMode true
        javaMaxHeapSize "4g"
    }

    buildTypes {
        release {
            // Enables code shrinking, obfuscation, and optimization for only
            // your project's release build type.
            minifyEnabled true

            // Enables resource shrinking, which is performed by the
            // Android Gradle plugin.
            shrinkResources true

            // Includes the default ProGuard rules files that are packaged with
            // the Android Gradle plugin. To learn more, go to the section about
            // R8 configuration files.
            proguardFiles getDefaultProguardFile(
                    'proguard-android-optimize.txt'),
                    'proguard-rules.pro'

        }

        debug{
            // Enables code shrinking, obfuscation, and optimization for only
            // your project's release build type.
            minifyEnabled true

            // Enables resource shrinking, which is performed by the
            // Android Gradle plugin.
            shrinkResources true

            // Includes the default ProGuard rules files that are packaged with
            // the Android Gradle plugin. To learn more, go to the section about
            // R8 configuration files.
            proguardFiles getDefaultProguardFile(
                    'proguard-android-optimize.txt'),
                    'proguard-rules.pro'
        }
    }

    externalNativeBuild {

        cmake {
            path "CMakeLists.txt"
        }

    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support:support-annotations:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'


    ...


    implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'

    implementation 'com.android.support:multidex:1.0.3'



}


apply plugin: 'com.google.gms.google-services'

я изменил действие намерения с НИЗКОГО на ИЗМЕНЕННОЕ, но проблема не решена.


person Morteza Jalambadani    schedule 18.12.2019    source источник


Ответы (1)


Вы пытаетесь зарегистрировать приемник вещания в приемнике вещания,

удалить Intent batteryStatus = context.registerReceiver(null, iFilter);

зарегистрируйте свой сервис в Activity/Fragment

вам следует позвонить context.sendBroadcast, если вы хотите отправить трансляцию

person Murat    schedule 18.12.2019
comment
я делаю это изменено, но проблема остается - person Morteza Jalambadani; 19.12.2019
comment
удалить Intent batteryStatus = context.registerReceiver (null, iFilter); зарегистрируйте свой широковещательный приемник в MainActivity, удалите папку сборки, очистите проект и снова перестройте - person Murat; 19.12.2019