[英]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.