當前位置:首頁 » 安卓系統 » androidscan

androidscan

發布時間: 2023-03-19 00:00:17

㈠ 【Android初級】android掃描WiFi列表的正確用法

最近有個需求,需要做一個掃描WiFi列表的功能,也在網上找了一些資料,但有些資料是有問題的,然後自己摸索了下,總結如下。

本地環境:

AS版本 3.0.1,DEMO APK 的 Min SDK Version 是 API 23,Target SDK Version 是 API 24,Compile SDK Version是 API 26,真機是Android 7.0

1、打開WiFi,並打開定位服務(在設置內找到定位服務-訪問我的位置信息-開啟)

2、在 onCreate 裡面動態申請許可權

String[] PERMS_INITIAL={Manifest.permission.ACCESS_FINE_LOCATION};

requestPermissions(PERMS_INITIAL,127);

3、在 onCreate 裡面注冊廣播

IntentFilter filter =new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

registerReceiver(mReceiver, filter);

4、定義 mReceiver

private BroadcastReceivermReceiver =new BroadcastReceiver() {

@Override

    public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {

List results =wifiManager.getScanResults();

if (results !=null) {

Log.d(TAG,"results size: " + results.size());

}

}

}

};

5、在layout裡面定義一個Button,點擊後開始掃描

WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);

boolean scanResult =wifiManager.startScan(); // 最好檢查下返回值,因為這個方法可能會調用失敗

Log.d(TAG,"scanResult: " + scanResult);

6、在 AndroidManifest.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"/>

有人可能會有疑問,為什麼在 onCreate裡面動態申請了許可權 ACCESS_FINE_LOCATION,又在 Manifest 裡面重復聲明了一次

經過本地驗證,去掉其中任意一個,都拿不到WiFi掃描結果,也就是 onReceive 方法不會被執行(有不同結論的請留言共同探討)

7、錯誤用法

boolean scanResult =wifiManager.startScan();

List list =wifiManager.getScanResults();

調用 startScan 之後立馬調用 getScanResults,這個時候拿到的WiFi列表是上一次的掃描結果,不是最新的,一定要在廣播接收器裡面獲取掃描結果。

㈡ Android藍牙掃描

藍牙掃描的目的在於發現設備或者接收設備廣播,設備包括經典藍牙設備和BLE藍牙設備,這兩種設備的掃描方式不同。

對於經典藍牙設備,掃描是通過調用startDiscovery介面,返回的結果是通過BroadcastReceiver接收的,可以獲取設備MAC地址,名稱以及RSSI。

startDiscovery是個非同步調用,會立即返回。如果不調用cancelDiscovery主動停止掃描的話,最多掃描12s。

廣播主要監聽以下幾個Action:

BluetoothDevice.ACTION_FOUND

BluetoothAdapter.ACTION_DISCOVERY_STARTED

BluetoothAdapter.ACTION_DISCOVERY_FINISHED

另外要注意startDiscovery返回的設備不包括已配對設備,如要獲取已配對設備,需要額外調用getBondedDevices。

對於BLE藍牙設備,掃描是通過調用startLeScan介面,返回的結果是通過onLeScan回調,除了獲得設備MAC地址,名稱及RSSI之外還能獲取設備廣播,廣播是以byte數組的形式表示的。

較新的Android版本提供了新的掃描介面,可更靈活地配置掃描策略,詳情可參考官網文檔,此處不再贅述。

一,需要打開以下許可權

android.permission.BLUETOOTH

android.permission.ACCESS_COARSE_LOCATION

android.permission.BLUETOOTH_ADMIN

android.permission.ACCESS_FINE_LOCATION

另外還要注意動態許可權問題,在Android 6.0(targetSdkVersion>=23)之後,需要動態申請獲取用戶位置的許可權,不然獲取不到設備掃描結果。

二,startDiscovery在大多數手機上是可以同時發現經典藍牙和Ble的,但是startDiscovery的回調無法返回BLE的廣播,所以無法通過廣播識別設備,且startDiscovery掃描BLE的效率比startLeScan低很多。所以在實際應用中,還是startDiscovery和startLeScan分開掃,前者掃經典藍牙,後者掃低功耗藍牙。

三,startLeScan() 的時候,在onLeScan() 中不能做耗時操作,特別是周圍的BLE設備多的時候,容易導致底層堵塞,如果有耗時操作請丟到子線程中去處理。如解析廣播識別設備等操作可能會較耗時。

四,實踐中發現同樣一個設備,有的手機很容易就掃出來了,有的手機很難掃出來。這種情況建議可以多掃幾次,每次掃描時間短一點。

㈢ android開發 如何實現掃描本地二維碼圖片

開源的二維碼掃描庫主要有zxing和zbar,zbar在iPos平台上應用比較成熟,而在Android平台上主流還是用zxing庫,因此這里主要講述如何利用zxing進行二維碼開發。

  • 如何將zxing的Android源碼導入工程。

    • 在導入zxing的android源碼之前,先去官方下載zxing的源碼http://code.google.com/p/zxing/downloads/list。

    • 這里以1.6版本為例,zxing 1.6源碼結構如下:


      <?xmlversion="1.0"encoding="utf-8"?>
      <manifestxmlns:android="http://schemas.android.com/apk/res/android"
      package="com.qrcode"
      android:versionCode="1"
      android:versionName="1.0">
      <uses-sdkandroid:minSdkVersion="7"/>

      <uses-permissionandroid:name="android.permission.VIBRATE"/><!--震動許可權-->
      <uses-permissionandroid:name="android.permission.CAMERA"/>
      <uses-featureandroid:name="android.hardware.camera"/><!--使用照相機許可權-->
      <uses-featureandroid:name="android.hardware.camera.autofocus"/><!--自動聚焦許可權-->
      <applicationandroid:icon="@drawable/icon"android:label="@string/app_name">
      <activityandroid:name=".MainActivity"
      android:label="@string/app_name">
      <intent-filter>
      <actionandroid:name="android.intent.action.MAIN"/>
      <categoryandroid:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
      </activity>

      <!--隱藏鍵盤--><!--全屏-->
      <activity
      android:configChanges="orientation|keyboardHidden"
      android:name="com.zxing.activity.CaptureActivity"
      android:screenOrientation="portrait"
      android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
      android:windowSoftInputMode="stateAlwaysHidden">
      </activity>
      </application>
      </manifest>

    • 這種情況大致就可以實現二維碼掃描了,想細化的話,還可以多看看安卓二維碼掃描開發相關的教程

㈣ Android保活——藍牙喚醒(主動kill掉也可喚醒)

項目需要後台保活,但無論怎麼保活,只要用戶主動kill掉,app依然是活不了。

發現了藍牙喚醒這個方式,用戶主動kill掉也可行。

Android 8.0開始提供了 startscan的方法,

public void startScan(ScanCallback callback)

public void startScan(List<ScanFilter> filters,ScanSettings settings,ScanCallback callback)

public int startScan(List<ScanFilter> filters,ScanSettings settings,PendingIntent callbackIntent)

第一個沒有過濾條件,鎖屏就停止掃描

第二個可以加過濾條件,鎖屏不影響掃描 

第三個的掃描結果由PendingIntent發送,即使app沒有在運行,系統也可以掃描後喚醒app,這就是我們要的方法了。

PendingIntent是對Intent的封裝,是滿足某些條件或觸發某些事件後才執行指定的行為,主要用於鬧鍾、通知、桌面部件。Android的四大組件之間通信用Intent,跨進程通信用PendingIntent。

Android 8.0 引進了Context.startForegroundService(),在系統創建服務後,應用需要在ANR發生前調用startForeground(int ,android.app.Notification),如果未及時調用該方法,系統將報ANR錯誤 。系統給前台服務的ANR時間是20秒。

用startScan藍牙喚醒的原理是:app向系統訂閱了掃描結果(預先加了過濾條件),當藍牙連接斷開的時候,設備就會發廣播,這時系統就可以掃描到對應的廣播,喚醒對應的service,這時想做什麼操作就根據你的項目需要了。至於系統會為你掃描多久,這個還沒測試。

(1)setScanMode有四個參數可以選 :

SCAN_MODE_BALANCED:在平衡電源模式下執行藍牙LE掃描。返回掃描結果的速度能夠很好地權衡掃描頻率和功耗。

SCAN_MODE_LOW_LATENCY:掃描使用最高占空比。建議只在應用程序在前台運行時使用此模式。

SCAN_MODE_LOW_POWER:在低功耗模式下執行藍牙LE掃描。這是默認的掃描模式,因為它消耗的能量最少。如果掃描應用程序不在前台,則強制執行此模式。

SCAN_MODE_OPPORTUNISTIC:一種特殊的藍牙LE掃描模式。使用這種掃描模式的應用程序將被動地偵聽其他掃描結果,而不啟動BLE掃描本身

(2)settingBuilder.setMatchMode有兩個參數可以選:

MATCH_MODE_AGGRESSIVE:  信號弱也會報告 

MATCH_MODE_STICKY:  信號比較強和掃描到的次數比較多才會報告

(3)settingBuilder.setCallbackType也有其他參數可選,但適用的就一個

  (4)  ScanFilter  的過濾方法有幾個,如下圖,打勾的是測試了可行的,但只有第一個DeviceAddress有唯一性  

㈤ 淫技:android無屏操作之adb操控wifi

1.開啟wpa_supplicant服啟櫻務端

meta_wpa_supplicant.conf是配置文件,ctrl_interface是wpa_supplicant與wpa_cli通信的介面,ssid為要連接的wifi熱點名稱,key_mgmt為加密方式(NONE表示不加密 O(∩_∩)O~)。

2.wpa_cli連接wpa_supplicant

3.掃描wifi

4.使能network0

上面都是完整的語句,我們可以直接使用/system/bin/wpa_cli -iwlan0 -p /data/misc/wifi/sockets進入wifi命令模式,如下圖所示,wifi命令模式下可以直接使用scan,status等指令

成功連上了TE-NonSignal的wifi,你可能會納悶,怎麼執行enable_network 0就連上了呢?手機怎悄旁叢么知道network 0是什麼鬼呢?上面說了有個配置文件meta_wpa_supplicant.conf,有了這個配置文件就會自動連接TE-NonSignal網路了。

上面是使用配置文件去連接網路,當然我們也可以用命令行去連接網路啦
執行scan
然後執行scan_result,下圖為掃描結果

例如我們要連啟數個公共網路OPPO-SZ,首先我們執行
add_network 如下圖返回4,說明接下來要連接的network的id為4

依次執行
set_network 4 ssid "OPPO-SZ"
set_network 4 key_mgmt NONE
enable_network 4
如下圖,說明成功連接上wifi了

熱點內容
八卦手指演算法 發布:2025-05-11 03:23:32 瀏覽:279
編譯成exe是什麼意思 發布:2025-05-11 03:23:28 瀏覽:468
javaweb技術內幕 發布:2025-05-11 03:20:14 瀏覽:802
多台焊機變壓器怎麼配置 發布:2025-05-11 03:18:07 瀏覽:309
nmake編譯 發布:2025-05-11 03:04:32 瀏覽:621
房產證加密碼 發布:2025-05-11 02:49:17 瀏覽:340
伺服器少個陣列卡盤符怎麼找出來 發布:2025-05-11 02:34:07 瀏覽:635
鬥地主源碼開發 發布:2025-05-11 02:24:07 瀏覽:366
雲伺服器怎麼設置攻擊 發布:2025-05-11 02:22:09 瀏覽:826
python嵌套for循環 發布:2025-05-11 01:51:44 瀏覽:228