android-WifiService

  • Android WIFI架构

目前Android WiFi系统集成了wpa_supplicant,并且以此为核心来链接上层和驱动的接口。

WiFi启动:

  • framework层:

Android\framework\opt\net\wifi\service\java\com\android\server\wifi\WifiService.java

WiFiService继承SystemService,系统起来时,SystemService创建ConnectivityService,

然后由ConnectivityService创建WifiService.

WifiService创建又new WifiServiceImpl。

WiFiService又重写了SystemService的接口。

 

上层通过调用:onBootPhase--> checkAndStartWifi:

(这个函数检查是否已经准备启动WiFi,判断是否需要重新启动系统服务来解密设备,如果已经解密的话,就检查是否需要打开WiFi或设置成enable状态)

WifiSettingsStore 存储WiFi相关的信息:WiFi是否enable,飞行模式

状态机:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个在Android 11上的WiFi开发完整案例: 1. Manifest文件配置权限和服务。 ```xml <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <service android:name="com.example.wifiservice.WifiService" android:enabled="true" android:exported="false"/> ``` 2. 创建Service类,实现WifiManager的各种相关操作。其中需要注意的是,在Android 11及以上版本,通过WifiManager获取到的Wifi信息已经不再包含SSID等敏感信息,需要通过registerNetworkCallback或者扫描接口获取到。 ```java public class WifiService extends Service { private final String TAG = WifiService.class.getSimpleName(); private WifiManager wifiManager; private Context context; private WifiScanResultListener scanResultListener; @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); Log.d(TAG, "WifiService onCreate"); wifiManager = (WifiManager) this.getApplicationContext().getSystemService(Context.WIFI_SERVICE); context = this.getApplicationContext(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "WifiService onStartCommand"); if (intent != null) { String action = intent.getAction(); if (action != null && action.equals("start_scan")) { startScan(); } } return START_STICKY; } /** * 开始扫描Wifi */ private void startScan() { wifiManager.startScan(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { registerNetworkCallback(); } else { scanResultListener = new WifiScanResultListener(); IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); context.registerReceiver(scanResultListener, filter); } } /** * Android 11及以上版本通过registerNetworkCallback获取Wifi信息 */ @RequiresApi(api = Build.VERSION_CODES.R) private void registerNetworkCallback() { NetworkRequest.Builder builder = new NetworkRequest.Builder(); builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI); final ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivityManager != null) { connectivityManager.registerNetworkCallback(builder.build(), new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { Log.d(TAG, "onAvailable network=" + network); List<ScanResult> scanResults = wifiManager.getScanResults(); if (scanResults != null && scanResults.size() > 0) { for (ScanResult scanResult : scanResults) { Log.d(TAG, "onAvailable scanResult=" + scanResult.toString()); } } } }); } } /** * Android 11以下版本通过扫描接口获取Wifi信息 */ private class WifiScanResultListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action != null && action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { List<ScanResult> scanResults = wifiManager.getScanResults(); if (scanResults != null && scanResults.size() > 0) { for (ScanResult scanResult : scanResults) { Log.d(TAG, "onReceive scanResult=" + scanResult.toString()); } } } } } } ``` 3. 在Activity中控制Service的开启和关闭。 ```java public class MainActivity extends AppCompatActivity { private Button btnStart, btnStop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnStart = findViewById(R.id.btn_start); btnStop = findViewById(R.id.btn_stop); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, WifiService.class); intent.setAction("start_scan"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { startForegroundService(intent); } else { startService(intent); } } }); btnStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, WifiService.class); stopService(intent); } }); } } ``` 以上就是一个在Android 11上的WiFi开发完整案例,通过使用Service和WifiManager,实现了对WiFi的扫描和获取WiFi信息的功能,并根据不同Android版本做了不同的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值