Wifi BroadcastReceiverを登録して、WiFiの状態が変化したときにWifiの状態を取得しようとしました。しかし、今のところ私は放送を受信することができません。
<application
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name" >
<receiver Android:name=".WifiReceiver" >
<intent-filter>
<action Android:name="Android.net.wifi.WifiManager.WIFI_STATE_CHANGED_ACTION" />
<action Android:name="Android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
//activity declaration here...
</application>
BraodcastReceiverをマニフェストに登録する方法を知っていますか?
アクティビティに登録したくないしたいのでwifiを監視アプリケーションが実行中かどうかに関係なく、wifi状態に変化がある場合。
これは私のBroadcastReceiverクラスです:
public class WifiReceiver extends BroadcastReceiver {
private final String TAG = "WifiReceiver";
@Override
public void onReceive(Context context, Intent intent) {
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN);
String wifiStateText = "No State";
switch (wifiState) {
case WifiManager.WIFI_STATE_DISABLING:
wifiStateText = "WIFI_STATE_DISABLING";
break;
case WifiManager.WIFI_STATE_DISABLED:
wifiStateText = "WIFI_STATE_DISABLED";
break;
case WifiManager.WIFI_STATE_ENABLING:
wifiStateText = "WIFI_STATE_ENABLING";
break;
case WifiManager.WIFI_STATE_ENABLED:
wifiStateText = "WIFI_STATE_ENABLED";
break;
case WifiManager.WIFI_STATE_UNKNOWN:
wifiStateText = "WIFI_STATE_UNKNOWN";
break;
default:
break;
}
MyLog.d(TAG, "onReceive Broadcast > WiFiState: " + wifiStateText);
MyLog.d(TAG, "onReceive Broadcast > Time: " + new Date());
}
}
私は本当に助けてもらいたいです。前もって感謝します。
マニフェストのレシーバーは次のようになります
<receiver Android:name=".WifiReceiver" >
<intent-filter>
<action Android:name="Android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
また、以下の許可が必要になる場合があります
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
ターゲットAndroidバージョンがAndroid O.よりも大きい場合。
注:アプリがAPIレベル26以上を対象としている場合、マニフェストを使用して、暗黙のブロードキャスト(アプリを具体的に対象としないブロードキャスト)のレシーバーを宣言することはできません。ただし、その制限から除外されているいくつかの暗黙のブロードキャストを除きます。ほとんどの場合、代わりにスケジュールされたジョブを使用できます。
リソース: https://developer.Android.com/guide/components/broadcasts
<receiver Android:name=".WifiReceiver" >
<intent-filter Android:priority="100" >
<action
Android:name="Android.net.wifi.WIFI_STATE_CHANGED"
Android:enabled="true" />
</intent-filter>
</receiver>
高優先度と有効化フラグをtrueとして入力します
ブロードキャストがフラグIntent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOTで送信されたというだけの理由で、アプリはこのレシーバーをAndroid起動する前に登録する必要があります。これは、システムサービスのみとなります。
私のために働いた最高のもの:
マニフェスト:
<receiver Android:name="com.AEDesign.communication.WifiReceiver">
<intent-filter Android:priority="100">
<action Android:name="Android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
WifiReceiver Class:
public class WifiReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(info != null) {
if(info.isConnected()) {
//Do your work.
//To check the Network Name or other info:
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID();
}
}
}
}
権限:
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE"/>
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE"/>
私はあなたがこのように受信機を登録したと思います:
<receiver
Android:name=".WiFiReciever">
<intent-filter>
<action
Android:name="class name with package" />
<data
Android:scheme="myscheme" />
</intent-filter>
</receiver>