简体   繁体   English

检测屏幕关/开并在Android中更改wifi状态

[英]Detect screen off/on and change wifi state in Android

I'm trying to setup a service that detect when screen goes off and disable the wifi. 我正在尝试设置检测屏幕何时关闭并禁用wifi的服务。

Here is my code: 这是我的代码:

Service: 服务:

public static boolean isScreen;

private int mInterval = 5000;
private Handler mHandler;

@Override
public void onCreate() {
    mHandler = new Handler();

    startRepeatingTask();

    IntentFilter mFilter = new IntentFilter("com.my.package.myAction");
    BroadcastReceiver mReceiver = new screenReceiver();
    registerReceiver(mReceiver, mFilter);
}

Runnable mStatusChecker = new Runnable() {
    @Override
    public void run() {

        Intent intent = new Intent();
        intent.setAction("com.my.package.myAction");
        sendBroadcast(intent);

        PowerManager pm = (PowerManager) androidTweaker.this.getSystemService(Context.POWER_SERVICE);
        isScreen = pm.isScreenOn();

        mHandler.postDelayed(mStatusChecker, mInterval);
    }
};

void startRepeatingTask() {
    mStatusChecker.run();
}

void stopRepeatingTask() {
    mHandler.removeCallbacks(mStatusChecker);
}

And here is my first question: I set up an handler to check every 5 seconds the state of the screen. 这是我的第一个问题:我设置了一个处理程序,每5秒检查一次屏幕的状态。 Have you got any better solution? 你有更好的解决方案吗?

My receiver: 我的接收者:

public class screenReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (!myService.isScreen && !mWifi.isConnected()) {
            WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
            wifiManager.setWifiEnabled(false);
        }
}

} }

And here my service crash. 在这里我的服务崩溃。 The logcat report the error in this line: wifiManager.setWifiEnabled(false); logcat报告此行中的错误:wifiManager.setWifiEnabled(false); (Receiver) (接收器)

My manifest: 我的清单:

    <service android:name=".myService"/>

    <receiver android:name=".screenReceiver">
    <intent-filter>
        <action android:name="com.my.package.myAction"/>
    </intent-filter>
    </receiver>

</application>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<user-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<user-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />

My service of course got a notification with foreground, so it's always on. 我的服务当然得到了前景通知,因此它始终开启。 Any help? 有帮助吗?

Edit: I got the main problem (changing wifi state) solved by replace 编辑:我得到了替换解决的主要问题(改变wifi状态)

<user-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<user-permission android:name="android.permission.CHANGE_WIFI_STATE" />

with

<use**s**-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<use**s**-permission android:name="android.permission.CHANGE_WIFI_STATE" />

Any way to let the service detect screen off without handler? 任何方式让服务检测屏幕没有处理程序?

EDIT2: Problem 1 also solved: 编辑2:问题1也解决了:

Service: 服务:

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction("com.my.package.myAction");
BroadcastReceiver mReceiver = new screenReceiver();
registerReceiver(mReceiver, filter);

Receiver: 接收器:

@Override
public void onReceive(Context context, Intent intent) {

    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        wifiManager.setWifiEnabled(false);
    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        wifiManager.setWifiEnabled(true);
    }
    Intent i = new Intent(context, androidTweaker.class);
    context.startService(i);
}

You need to add below lines in your manifest receiver for wifi state change: 您需要在清单接收器中添加以下行以进行wifi状态更改:

<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.SCAN_RESULTS" />  

Hope this helps. 希望这可以帮助。

要获得屏幕的开/关状态,请使用ACTION_SCREEN_ON和ACTION_SCREEN_OFF意图。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM