androidscan
㈠ 【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了