Я пытаюсь реализовать базовый приемник для 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>
В эмуляторе я меняю следующий параметр:
Я вижу, что статус меняется на панели телефона, но мой код не выполняется.
Есть идеи, что мне не хватает?
TL; DR (XY)
Моя цель - включить USB-модем автоматически при подключении к USB, только если час находится между 8: 00-22: 00. Идея состоит в том, чтобы заблокировать использование Интернета вне указанных часов.
На телефоне - настройки, магазин приложений, браузеры, Youtube и горячая точка заблокированы паролем. Таким образом, Интернет можно использовать только для WhatsApp, waze и USB-модем. Однако в настоящее время для этого «администратор» должен каждый раз вручную включать / отключать USB-модем в настройках.
Итак, я намереваюсь создать это приложение, которое, на мой взгляд, должно быть простым, дать ему разрешение на изменение настроек:
У меня умеренный опыт программирования на C++ / python и немного Java, но это моя первая попытка использовать Android.




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)):
}
Рекомендации :