USB 广播接收器 (ACTION_POWER) 不工作

USB broadcast receiver (ACTION_POWER) not working

我正在尝试实现一个用于 USB 连接的基本接收器。找到参考 here.

我搜索了很多,但无法正常工作...

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>

在模拟器上,我正在更改以下设置:

我看到 phone 栏上的状态正在改变,但我的代码没有执行。

知道我错过了什么吗?

TL;DR (XY)

我的目标是在连接到 USB 时自动启用 USB 网络共享,前提是小时数在 8:00-22:00 之间。这个想法是阻止在指定时间之外使用互联网。

在 phone - 设置、应用商店、浏览器、Youtubehotspot 上都被密码锁定。因此互联网只能用于 WhatsappwazeUSB 网络共享。但是,这目前需要“管理员”每次都在设置中手动 enable/disable USB 网络共享。

所以我打算创建这个我认为应该很简单的应用程序,授予它更改设置的权限:

  1. 在 8:00 和 22:00 之间的每个 USB 连接上启用网络共享。
  2. 在 22:00 上禁用网络共享(如果启用)。

我有中等的 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 版本你必须注册接收者才能使用这段代码在您的 Activity 或者如果您想收听 Power Connection 中的变化后台使用 Service

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 启动它 一般在APIs 26以下是不需要这个服务的(可以自己查)。在此代码中,我仅针对 API 26

以上版本启动了 PowerService
 // 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)):
    }

参考资料: