簡體   English   中英

執行App時廣播接收器無法正常工作

[英]Broadcast receiver not working correctly when App is Executed

問題描述:我正在嘗試開發一個簡單的Android應用程序,以強制連接到已存儲在手機上的特定開放式WiFi配置。

注冊廣播接收機以監視連接狀態。 如果連接成功,那么我想在屏幕上打印一條消息。

在下面的代碼段中,注冊的廣播接收器是ConnectionReceiver()。 執行應用程序時,永遠不會打印Toast消息。 如果我檢查電話wifi設置菜單,則設備已連接到wifi網絡。

知道為什么代碼永遠不會進入廣播接收器的if(networkInfo.isConnected()....語句中。

我執行了以下檢查:1.確認嘗試連接的wifi網絡設備處於活動狀態。 2.在設置菜單中確認設備可以手動連接到設備。 3.運行調試器-在Toast消息上添加斷點,並確認if語句但不顯示Toast消息正在進入執行。 4.我也嘗試顯示活動屏幕,但它也沒有顯示。 5.確認廣播接收器已注冊。 6.確認清單文件包含以下權限:

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

知道為什么敬酒消息未顯示在下面的代碼片段中嗎?

    package com.agt01.wifitest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.widget.Toast;

import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

public static final String SSID = "vego";
private static final int REQUEST_ENABLE_WIFI = 10;
private static final int TIMEOUT = 20;
private ConnectionReceiver connectionReceiver;
private final ScheduledExecutorService worker =
        Executors.newSingleThreadScheduledExecutor();
private ScheduledFuture taskHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WifiManager wifiManager  = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    if (wifiManager.isWifiEnabled()) {
        connectToSpecificNetwork();
    } else {
        showWifiDisabledDialog();
    }


}

private void connectToSpecificNetwork() {
    WifiManager wifiManager  = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    if (networkInfo.isConnected() && wifiInfo.getSSID().replace("\"", "").equals(SSID)) {
        setContentView(R.layout.activity_conect);
        return;
    }
    else {
        List<WifiConfiguration> wifiConfigurations = wifiManager.getConfiguredNetworks();
        for (WifiConfiguration wifiConfiguration : wifiConfigurations) {
            if (wifiConfiguration.SSID.equals("\"" + SSID + "\"")) {
                connectionReceiver = new ConnectionReceiver();
                IntentFilter intentFilter = new IntentFilter();
                intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
                intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
                intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
                intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
               // setContentView(R.layout.activity_main);
                registerReceiver(this.connectionReceiver, intentFilter);
                wifiManager.enableNetwork(wifiConfiguration.networkId, true);
                //Log.i(TAG, "connectToWifi: will enable " + wifiConfiguration.SSID);
                wifiManager.reconnect();
                break;
            }
        }

    }

}


/**
 * Broadcast receiver for connection related events
 */
private class ConnectionReceiver extends BroadcastReceiver {

    WifiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE);


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

        WifiManager wifiManager  = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        CharSequence text = "Hello toast!";
        int duration = Toast.LENGTH_LONG;

        Toast toast = Toast.makeText(getApplicationContext(), text, duration);

        if (networkInfo.isConnected() && wifiInfo.getSSID().replace("\"", "").equals(SSID)) {
            setContentView(R.layout.activity_connected);
            toast.show();
        }
    }
}

// User has returned from settings screen. Check if wifi is enabled
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_ENABLE_WIFI && resultCode == 0) {
        WifiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE);
        if (wifi.isWifiEnabled() || wifi.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
            connectToSpecificNetwork();
        } else {
            finish();
        }
    } else {
        finish();
    }
}
/**
 * Ask user to go to settings and enable wifi
 */
private void showWifiDisabledDialog() {
    new AlertDialog.Builder(this)
            .setCancelable(false)
            .setMessage(getString(R.string.wifi_disabled))
            .setPositiveButton(getString(R.string.enable_wifi), new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // open settings screen
                    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
                    startActivityForResult(intent, REQUEST_ENABLE_WIFI);
                }
            })
            .setNegativeButton(getString(R.string.exit_app), new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            })
            .show();
}

}

如果即使在輸入if語句后仍未顯示Toast消息,則通常可能是上下文問題。 嘗試Toast.makeText(getContext(), text, duration)Toast.makeText(getApplicationContext(), text, duration)等。

請檢查以下代碼,它對我來說非常有效,即顯示Hello Toast! 信息。 在運行應用程序之前,我已連接到wifi。 (為了測試,我更改了if else邏輯)

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.widget.Toast;

import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class MainActivity extends AppCompatActivity {

    public static final String SSID = "SD";
    private static final int REQUEST_ENABLE_WIFI = 10;
    private static final int TIMEOUT = 20;
    private ConnectionReceiver connectionReceiver;
    private final ScheduledExecutorService worker =
            Executors.newSingleThreadScheduledExecutor();
    private ScheduledFuture taskHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        if (wifiManager.isWifiEnabled()) {
            connectToSpecificNetwork();
        } else {
            showWifiDisabledDialog();
        }


    }

    private void connectToSpecificNetwork() {
        WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        if (!networkInfo.isConnected() && wifiInfo.getSSID().replace("\"", "").equals(SSID)) {
            setContentView(R.layout.activity_main);
            return;
        } else {
            List<WifiConfiguration> wifiConfigurations = wifiManager.getConfiguredNetworks();
            for (WifiConfiguration wifiConfiguration : wifiConfigurations) {
                if (wifiConfiguration.SSID.equals("\"" + SSID + "\"")) {
                    connectionReceiver = new ConnectionReceiver();
                    IntentFilter intentFilter = new IntentFilter();
                    intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
                    intentFilter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
                    intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
                    intentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
                    // setContentView(R.layout.activity_main);
                    registerReceiver(this.connectionReceiver, intentFilter);
                    wifiManager.enableNetwork(wifiConfiguration.networkId, true);
                    //Log.i(TAG, "connectToWifi: will enable " + wifiConfiguration.SSID);
                    wifiManager.reconnect();
                    break;
                }
            }

        }

    }


    /**
     * Broadcast receiver for connection related events
     */
    private class ConnectionReceiver extends BroadcastReceiver {

        WifiManager wifi = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);


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

            WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            CharSequence text = "Hello toast!";
            int duration = Toast.LENGTH_LONG;

            Toast toast = Toast.makeText(getApplicationContext(), text, duration);

            if (networkInfo.isConnected() && wifiInfo.getSSID().replace("\"", "").equals(SSID)) {
                setContentView(R.layout.activity_main);
                toast.show();
            }
        }
    }

    // User has returned from settings screen. Check if wifi is enabled
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_ENABLE_WIFI && resultCode == 0) {
            WifiManager wifi = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
            if (wifi.isWifiEnabled() || wifi.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {
                connectToSpecificNetwork();
            } else {
                finish();
            }
        } else {
            finish();
        }
    }

    /**
     * Ask user to go to settings and enable wifi
     */
    private void showWifiDisabledDialog() {
        new AlertDialog.Builder(this)
                .setCancelable(false)
                .setMessage("wifi disabled")
                .setPositiveButton("enable wifi", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // open settings screen
                        Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
                        startActivityForResult(intent, REQUEST_ENABLE_WIFI);
                    }
                })
                .setNegativeButton("exit app", new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog, int which) {
                        finish();
                    }
                })
                .show();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM