Skip to content

Commit 5aa082f

Browse files
[wifi_info_flutter] Check Permissions in Android O or higher (flutter#3234)
* Check Permissions * Format * Update packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java Co-authored-by: Maurice Parrish <[email protected]> * Update packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java Co-authored-by: Maurice Parrish <[email protected]> * Update packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java Co-authored-by: Maurice Parrish <[email protected]> * Update packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java Co-authored-by: Maurice Parrish <[email protected]> * Update packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java Co-authored-by: Maurice Parrish <[email protected]> * Update packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java Co-authored-by: Maurice Parrish <[email protected]> * Update packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java Co-authored-by: Maurice Parrish <[email protected]> * Update packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java Co-authored-by: Maurice Parrish <[email protected]> Co-authored-by: Maurice Parrish <[email protected]>
1 parent ad308e5 commit 5aa082f

File tree

6 files changed

+120
-10
lines changed

6 files changed

+120
-10
lines changed

packages/wifi_info_flutter/wifi_info_flutter/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 1.0.4
2+
3+
* Android: Add Log warning for unsatisfied requirement(s) in Android P or higher.
4+
* Android: Update Example project.
5+
16
## 1.0.3
27

38
* Fix README example.

packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutter.java

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,31 @@
44

55
package io.flutter.plugins.wifi_info_flutter;
66

7+
import android.Manifest;
8+
import android.content.Context;
9+
import android.content.pm.PackageManager;
10+
import android.location.LocationManager;
711
import android.net.wifi.WifiInfo;
812
import android.net.wifi.WifiManager;
13+
import android.os.Build;
14+
import androidx.core.content.ContextCompat;
15+
import io.flutter.Log;
916

1017
/** Reports wifi information. */
1118
class WifiInfoFlutter {
1219
private WifiManager wifiManager;
20+
private Context context;
21+
private static final String TAG = "WifiInfoFlutter";
1322

14-
WifiInfoFlutter(WifiManager wifiManager) {
23+
WifiInfoFlutter(WifiManager wifiManager, Context context) {
1524
this.wifiManager = wifiManager;
25+
this.context = context;
1626
}
1727

1828
String getWifiName() {
29+
if (!checkPermissions()) {
30+
return null;
31+
}
1932
final WifiInfo wifiInfo = getWifiInfo();
2033
String ssid = null;
2134
if (wifiInfo != null) ssid = wifiInfo.getSSID();
@@ -25,6 +38,9 @@ String getWifiName() {
2538
}
2639

2740
String getWifiBSSID() {
41+
if (!checkPermissions()) {
42+
return null;
43+
}
2844
final WifiInfo wifiInfo = getWifiInfo();
2945
String bssid = null;
3046
if (wifiInfo != null) {
@@ -53,4 +69,89 @@ String getWifiIPAddress() {
5369
private WifiInfo getWifiInfo() {
5470
return wifiManager == null ? null : wifiManager.getConnectionInfo();
5571
}
72+
73+
private Boolean checkPermissions() {
74+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
75+
return true;
76+
}
77+
78+
boolean grantedChangeWifiState =
79+
ContextCompat.checkSelfPermission(context, Manifest.permission.CHANGE_WIFI_STATE)
80+
== PackageManager.PERMISSION_GRANTED;
81+
82+
boolean grantedAccessFine =
83+
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
84+
== PackageManager.PERMISSION_GRANTED;
85+
86+
boolean grantedAccessCoarse =
87+
ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION)
88+
== PackageManager.PERMISSION_GRANTED;
89+
90+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P
91+
&& !grantedChangeWifiState
92+
&& !grantedAccessFine
93+
&& !grantedAccessCoarse) {
94+
Log.w(
95+
TAG,
96+
"Attempted to get Wi-Fi data that requires additional permission(s).\n"
97+
+ "To successfully get WiFi Name or Wi-Fi BSSID starting with Android O, please ensure your app has one of the following permissions:\n"
98+
+ "- CHANGE_WIFI_STATE\n"
99+
+ "- ACCESS_FINE_LOCATION\n"
100+
+ "- ACCESS_COARSE_LOCATION\n"
101+
+ "For more information about Wi-Fi Restrictions in Android 8.0 and above, please consult the following link:\n"
102+
+ "https://developer.android.com/guide/topics/connectivity/wifi-scan");
103+
return false;
104+
}
105+
106+
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.P && !grantedChangeWifiState) {
107+
Log.w(
108+
TAG,
109+
"Attempted to get Wi-Fi data that requires additional permission(s).\n"
110+
+ "To successfully get WiFi Name or Wi-Fi BSSID starting with Android P, please ensure your app has the CHANGE_WIFI_STATE permission.\n"
111+
+ "For more information about Wi-Fi Restrictions in Android 9.0 and above, please consult the following link:\n"
112+
+ "https://developer.android.com/guide/topics/connectivity/wifi-scan");
113+
return false;
114+
}
115+
116+
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.P
117+
&& !grantedAccessFine
118+
&& !grantedAccessCoarse) {
119+
Log.w(
120+
TAG,
121+
"Attempted to get Wi-Fi data that requires additional permission(s).\n"
122+
+ "To successfully get WiFi Name or Wi-Fi BSSID starting with Android P, additional to CHANGE_WIFI_STATE please ensure your app has one of the following permissions too:\n"
123+
+ "- ACCESS_FINE_LOCATION\n"
124+
+ "- ACCESS_COARSE_LOCATION\n"
125+
+ "For more information about Wi-Fi Restrictions in Android 9.0 and above, please consult the following link:\n"
126+
+ "https://developer.android.com/guide/topics/connectivity/wifi-scan");
127+
return false;
128+
}
129+
130+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
131+
&& (!grantedAccessFine || !grantedChangeWifiState)) {
132+
Log.w(
133+
TAG,
134+
"Attempted to get Wi-Fi data that requires additional permission(s).\n"
135+
+ "To successfully get WiFi Name or Wi-Fi BSSID starting with Android Q, please ensure your app has the CHANGE_WIFI_STATE and ACCESS_FINE_LOCATION permission.\n"
136+
+ "For more information about Wi-Fi Restrictions in Android 10.0 and above, please consult the following link:\n"
137+
+ "https://developer.android.com/guide/topics/connectivity/wifi-scan");
138+
return false;
139+
}
140+
141+
LocationManager locationManager =
142+
(LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
143+
144+
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
145+
146+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !gpsEnabled) {
147+
Log.w(
148+
TAG,
149+
"Attempted to get Wi-Fi data that requires additional permission(s).\n"
150+
+ "To successfully get WiFi Name or Wi-Fi BSSID starting with Android P, please ensure Location services are enabled on the device (under Settings > Location).\n"
151+
+ "For more information about Wi-Fi Restrictions in Android 9.0 and above, please consult the following link:\n"
152+
+ "https://developer.android.com/guide/topics/connectivity/wifi-scan");
153+
return false;
154+
}
155+
return true;
156+
}
56157
}

packages/wifi_info_flutter/wifi_info_flutter/android/src/main/java/io/flutter/plugins/wifi_info_flutter/WifiInfoFlutterPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ private void setupChannels(BinaryMessenger messenger, Context context) {
3737
final WifiManager wifiManager =
3838
(WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
3939

40-
final WifiInfoFlutter wifiInfoFlutter = new WifiInfoFlutter(wifiManager);
40+
final WifiInfoFlutter wifiInfoFlutter = new WifiInfoFlutter(wifiManager, context);
4141

4242
final WifiInfoFlutterMethodChannelHandler methodChannelHandler =
4343
new WifiInfoFlutterMethodChannelHandler(wifiInfoFlutter);

packages/wifi_info_flutter/wifi_info_flutter/example/android/app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
22
package="io.flutter.plugins.wifi_info_flutter_example">
3+
4+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
5+
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
6+
37
<application
48
android:label="wifi_info_flutter_example"
59
android:icon="@mipmap/ic_launcher">

packages/wifi_info_flutter/wifi_info_flutter/example/lib/main.dart

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,12 @@ class _MyHomePageState extends State<MyHomePage> {
114114
}
115115
if (status == LocationAuthorizationStatus.authorizedAlways ||
116116
status == LocationAuthorizationStatus.authorizedWhenInUse) {
117-
wifiName = await _connectivity.getWifiName();
117+
wifiName = await _wifiInfo.getWifiName();
118118
} else {
119-
wifiName = await _connectivity.getWifiName();
119+
wifiName = await _wifiInfo.getWifiName();
120120
}
121121
} else {
122-
wifiName = await _connectivity.getWifiName();
122+
wifiName = await _wifiInfo.getWifiName();
123123
}
124124
} on PlatformException catch (e) {
125125
print(e.toString());
@@ -135,20 +135,20 @@ class _MyHomePageState extends State<MyHomePage> {
135135
}
136136
if (status == LocationAuthorizationStatus.authorizedAlways ||
137137
status == LocationAuthorizationStatus.authorizedWhenInUse) {
138-
wifiBSSID = await _connectivity.getWifiBSSID();
138+
wifiBSSID = await _wifiInfo.getWifiBSSID();
139139
} else {
140-
wifiBSSID = await _connectivity.getWifiBSSID();
140+
wifiBSSID = await _wifiInfo.getWifiBSSID();
141141
}
142142
} else {
143-
wifiBSSID = await _connectivity.getWifiBSSID();
143+
wifiBSSID = await _wifiInfo.getWifiBSSID();
144144
}
145145
} on PlatformException catch (e) {
146146
print(e.toString());
147147
wifiBSSID = "Failed to get Wifi BSSID";
148148
}
149149

150150
try {
151-
wifiIP = await _connectivity.getWifiIP();
151+
wifiIP = await _wifiInfo.getWifiIP();
152152
} on PlatformException catch (e) {
153153
print(e.toString());
154154
wifiIP = "Failed to get Wifi IP";

packages/wifi_info_flutter/wifi_info_flutter/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: wifi_info_flutter
22
description: A new flutter plugin project.
3-
version: 1.0.3
3+
version: 1.0.4
44
homepage: https://github.com/flutter/plugins/tree/master/packages/wifi_info_flutter/wifi_info_flutter
55

66
environment:

0 commit comments

Comments
 (0)