Приемник вещания USB (ACTION_POWER) не работает

Я пытаюсь реализовать базовый приемник для USB-подключения. Нашел ссылку здесь.

Я много искал, но не получается ...

package com.example.usbtethering;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "USB connected.", Toast.LENGTH_SHORT).show();
        Log.v("AAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAA");
    }
}
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
    package = "com.example.usbtethering">

    <application
        android:allowBackup = "true"
        android:icon = "@mipmap/ic_launcher"
        android:label = "@string/app_name"
        android:roundIcon = "@mipmap/ic_launcher_round"
        android:supportsRtl = "true"
        android:theme = "@style/Theme.USBTethering">
        <activity
            android:name = ".MainActivity"
            android:label = "@string/title_activity_main"
            android:theme = "@style/Theme.USBTethering.NoActionBar">
            <intent-filter>
                <action android:name = "android.intent.action.MAIN" />
                <category android:name = "android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name = ".MyReceiver">
            <intent-filter>
                <action android:name = "android.intent.action.ACTION_POWER_CONNECTED" />
                <action android:name = "android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

В эмуляторе я меняю следующий параметр:

Приемник вещания USB (ACTION_POWER) не работает

Я вижу, что статус меняется на панели телефона, но мой код не выполняется.

Есть идеи, что мне не хватает?

TL; DR (XY)

Моя цель - включить USB-модем автоматически при подключении к USB, только если час находится между 8: 00-22: 00. Идея состоит в том, чтобы заблокировать использование Интернета вне указанных часов.

На телефоне - настройки, магазин приложений, браузеры, Youtube и горячая точка заблокированы паролем. Таким образом, Интернет можно использовать только для WhatsApp, waze и USB-модем. Однако в настоящее время для этого «администратор» должен каждый раз вручную включать / отключать USB-модем в настройках.

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

  1. Включите модем для каждого USB-соединения с 8:00 до 22:00.
  2. Отключить модем (если включен) в 22:00.

У меня умеренный опыт программирования на C++ / python и немного Java, но это моя первая попытка использовать Android.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

As part of the Android 8.0 (API level 26) Background Execution Limits, apps that target the API level 26 or higher can no longer register broadcast receivers for implicit broadcasts in their manifest. However, several broadcasts are currently exempted from these limitations. Apps can continue to register listeners for the following broadcasts, no matter what API level the apps target.

Таким образом, в версии API> 28 вы должны зарегистрировать приемник, чтобы вы могли использовать этот фрагмент кода в своем Мероприятия или, если вы хотите прослушивать изменения Подключение к источнику питания в фоновом режиме, используйте Услуга

IntentFilter ACTION_POWER_CONNECTED = new IntentFilter("android.intent.action.ACTION_POWER_CONNECTED");
IntentFilter ACTION_POWER_DISCONNECTED = new IntentFilter("android.intent.action.ACTION_POWER_DISCONNECTED");
registerReceiver(new MyReceiver(), ACTION_POWER_CONNECTED);
registerReceiver(new MyReceiver(), ACTION_POWER_DISCONNECTED);

Я считаю, что вы хотите использовать Услуга, это пример:

Сначала вам нужно создать Услуга (PowerSerivce) в файле манифеста:

<service
        android:name = ".PowerService"
        android:stopWithTask = "false" />
        <!-- If set to true,
        this service with be automatically stopped when the user remove a task rooted in an activity owned by the application-->

А это PowerService.java:

import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import androidx.annotation.Nullable;

public class PowerService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        IntentFilter ACTION_POWER_CONNECTED = new IntentFilter("android.intent.action.ACTION_POWER_CONNECTED");
        IntentFilter ACTION_POWER_DISCONNECTED = new IntentFilter("android.intent.action.ACTION_POWER_DISCONNECTED");
        registerReceiver(new MyReceiver(), ACTION_POWER_CONNECTED);
        registerReceiver(new MyReceiver(), ACTION_POWER_DISCONNECTED);
        Log.d("Service", "onStartCommand: " );
        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("Service", "onDestroy: " );
    }
}

А это MyReciver:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.ACTION_POWER_CONNECTED")){
            Toast.makeText(context, "CONNECTED", Toast.LENGTH_LONG).show();
        }else if (intent.getAction().equals("android.intent.action.ACTION_POWER_DISCONNECTED")){
            Toast.makeText(context, "DISCONNECTED", Toast.LENGTH_LONG).show();
        }
    }
}

И, наконец, вам нужно запустить этот Услуга, в моем случае я запустил его только для API> = 26 обычно в API ниже 26 эта услуга не нужна (вы можете проверить это самостоятельно). в этом коде я запустил PowerService только для версии выше API 26

 // add this code in your first activity or where you want 
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
     startService(new Intent(this, PowerService.class)):
    }

Рекомендации :

Другие вопросы по теме