cs5530 mobile/wireless systems android...
TRANSCRIPT
Ref.CN5E,NT@UW,WUSTLCS5530
CS5530Mobile/WirelessSystemsAndroidWiFi Interface
YanyanZhuangDepartmentofComputerSciencehttp://www.cs.uccs.edu/~yzhuang
UC.ColoradoSprings
Midterm
Ref.CN5E,NT@UW,WUSTL2CS5530
• Easy?Difficult?• Time?
o Finalis2hoursinclass
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL3CS5530
• OniOSo Nopermissionneeded
o interfaceInfo =CNCopyCurrentNetworkInfo(interfaces){
BSSID="6c:f3:7f:ea:44:f1";
SSID="UCCS-Wireless";
SSIDDATA=<554343532d576972656c657373>;
}
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL4CS5530
• GettingWiFi connectioninformationonAndroid1. RequestuserpermissioninAndroidManifest.xml
2. CreateaWiFi manager(classWiFiManager)
3. GetWiFi informationfromthemanager(classWiFiInfo)
4. AcquiredatafromWiFiInfo class
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL5CS5530
• WiFi accesspermissiono AndroidManifest.xml
o Add} AccessingWiFi:<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
} ChangingWiFi:<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
o Accessrequestshowsupwhenuserdownload&install fromGooglePlayStore
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL6CS5530
• CreateaWiFi managero https://developer.android.com/reference/android/net/wifi/WifiManager.html
o ProvidestheprimaryAPIformanagingallaspectsofWi-Ficonnectivity
o Syntax} Context.getSystemService(Context.WIFI_SERVICE)
o Example} WifiManager wifiManager =(WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL7CS5530
• GetWiFi informationo https://developer.android.com/reference/android/net/wifi/WifiInfo.html
o WifiInfo wifiInfo =wifiManager.getConnectionInfo();
o Alotofinformationaccessible
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL8CS5530
• GetdatafromWiFiInfo classo wifiInfo.getBSSID()
} 6c:f3:7f:ea:44:f1router’s MACaddress
o wifiInfo.getMacAddress()} f8:a9:d0:81:70:48 phone’sMACaddress
o wifiInfo.getSSID()} "UCCS-Wireless"
o wifiInfo.getIpAddress()} 1098172032phone’sIPaddress(int)
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL9CS5530
• GetdatafromWiFiInfo classo wifiInfo.getLinkSpeed()
} 150(Mbps),indicatedbyconstantwifiInfo.LINK_SPEED_UNITS (string)
o wifiInfo.getRssi()} -64 (dBm)
o wifiInfo.getSupplicantState()} COMPLETED/ASSOCIATED/ASSOCIATING/AUTHENTICATING/DISCONNECTED/SCANNING/INACTIVE
o wifiInfo.getFrequency()} AvailableatAPIlevel21andabove(5.0Lollipop)
} 5220(MHz)indicatedbyconstantwifiInfo.FREQUENCY_UNITS (string)
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL10CS5530
• GetdatafromWiFiInfo classo wifiInfo.getLinkSpeed()
} 150(Mbps),indicatedbyconstantwifiInfo.LINK_SPEED_UNITS (string)
o wifiInfo.getRssi()} -64 (dBm)
o wifiInfo.getSupplicantState()} COMPLETED
o wifiInfo.getFrequency()} AvailableatAPIlevel21andabove
} Unit:MHz,indicatedbyconstantwifiInfo.FREQUENCY_UNITS (string)
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL11CS5530
• HowtochangeminAPIlevelo Rightclickappdirecotoryà “OpenModuleSettings”àSelectappà “Flavors”tablàMinSDKversion
o ClickOk,thenprojectwillberebuilt
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL12CS5530
• HowtoconvertintegerIPtostring(oldmethod)o int ip =wifiInfo.getIpAddress();StringipAddress =Formatter.formatIpAddress(ip);Log.v(TAG,ipAddress);
AndroidWiFi Interface
Ref.CN5E,NT@UW,WUSTL13CS5530
• HowtoconvertintegerIPtostring(newmethod)o http://stackoverflow.com/questions/16730711/get-my-wifi-ip-address-
android/21181887if(ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN))
ipAddress =Integer.reverseBytes(ipAddress);
byte[]ipByteArray =BigInteger.valueOf(ip).toByteArray();StringipAddressString;
try{ipAddressString =InetAddress.getByAddress(ipByteArray).getHostAddress();}catch(UnknownHostException ex){Log.e("WIFIIP","Unabletogethostaddress.");ipAddressString =null;}
AndroidLogmethod
Ref.CN5E,NT@UW,WUSTL14CS5530
• Printmessagestologcato https://developer.android.com/reference/android/util/Log.html
o Log.d()} DEBUGmessage
o Log.e()} ERRORmessage
o Log.i()} INFOmessage
AndroidLogmethod
Ref.CN5E,NT@UW,WUSTL15CS5530
• Printmessagestologcato Log.v()
} VERBOSEmessage
o Log.w()} WARNmessage
o Log.wtf()} WhataTerribleFailure:Reportaconditionthatshouldneverhappen
o Arguments:} Log.v(String tag, String msg)
} Tagforidentifyingthismessage
AndroidLogmethod
Ref.CN5E,NT@UW,WUSTL16CS5530
• Sometimeslogcathasnooutputo Knownproblem
o RestartAndroidstudio…
• adblogcat
catannounce.txt_
Ref.CN5E,NT@UW,WUSTL17CS5530
• Projects??!!• Lastclass:projectdemo
AndroidGetWiFi Connection
Ref.CN5E,NT@UW,WUSTL18CS5530
• WifiInfo wifiInfo =wifiManager.getConnectionInfo();
Log.v(TAG,wifiInfo.getBSSID());Log.v(TAG,wifiInfo.getMacAddress());Log.v(TAG,wifiInfo.getSSID());
int ip =wifiInfo.getIpAddress();StringipAddress =Formatter.formatIpAddress(ip);Log.v(TAG,ipAddress);
Log.v(TAG,Integer.toString(wifiInfo.getLinkSpeed())+wifiInfo.LINK_SPEED_UNITS);Log.v(TAG,Integer.toString(wifiInfo.getRssi())+"dBm");Log.v(TAG,wifiInfo.getSupplicantState().toString());
Log.v(TAG,Integer.toString(wifiInfo.getFrequency())+wifiInfo.FREQUENCY_UNITS);
AndroidBroadcasts(1)
Ref.CN5E,NT@UW,WUSTL19CS5530
• Androidappscansend/receivebroadcastmessagesfromtheAndroidsystemandotherAndroidapps• Broadcastsaresentwhenaneventofinterestoccurso Androidsystemsendsbroadcasts,e.g.,whenthesystembootsuporthedevicestartscharging
o Apps canalsosendcustombroadcasts,e.g.,tonotifyotherappsthatsomenewdatahasbeendownloaded
AndroidBroadcasts(2)
Ref.CN5E,NT@UW,WUSTL20CS5530
• AndroidSystemBroadcastso Systemautomaticallysendsbroadcastswhenvarioussystemeventsoccur,e.g.,whensystemswitchesin/outofairplanemode,WiFi scancomplete
o Appscanregistertoreceivespecificbroadcasts
o Systembroadcastsaresenttoallappssubscribed toreceivetheevent
AndroidBroadcasts(3)
Ref.CN5E,NT@UW,WUSTL21CS5530
• ToinitializeaWiFi scano wifiManager.startScan();
• Eachbroadcastactionhasaconstantfieldassociatedwithito android.app.action.ACTION_PASSWORD_CHANGEDo …o android.net.wifi.RSSI_CHANGEDo android.net.wifi.SCAN_RESULTSo android.net.wifi.WIFI_STATE_CHANGED
ReceivingBroadcasts(1)
Ref.CN5E,NT@UW,WUSTL22CS5530
• Createan IntentFiltero IntentFilter wifiFilter =newIntentFilter(wifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
• Registerthereceivero bycalling registerReceiver(BroadcastReceiver,IntentFilter)
} E.g.,IntentwifiIntent =getApplicationContext().registerReceiver(wifiReceiver,wifiFilter);
ReceivingBroadcasts(2)
Ref.CN5E,NT@UW,WUSTL23CS5530
• Createaninstanceof BroadcastReceivero BroadcastReceiver wifiReceiver =newBroadcastReceiver(){
@OverridepublicvoidonReceive(Contextcontext,Intentintent){
//definewhattodowhenreceivethebroadcast}
};
• Stopreceivingbroadcastso unregisterReceiver()
ReceivingWiFi ScanResults(1)
Ref.CN5E,NT@UW,WUSTL24CS5530
WifiManager wifiManager;publicstaticBroadcastReceiver wifiReceiver;publicstaticIntentFilter wifiFilter;publicstaticIntentwifiIntent;
wifiManager =(WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if(wifiManager.getWifiState()==wifiManager.WIFI_STATE_ENABLED){wifiFilter =newIntentFilter(wifiManager.SCAN_RESULTS_AVAILABLE_ACTION);wifiIntent =getApplicationContext().registerReceiver(wifiReceiver,wifiFilter);wifiManager.startScan(); //needspermissionandroid.permission.CHANGE_WIFI_STATE…...
}
ReceivingWiFi ScanResults(2)
Ref.CN5E,NT@UW,WUSTL25CS5530
wifiReceiver =newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){context.unregisterReceiver(this);List<ScanResult>results=wifiManager.getScanResults();
for(int i=0;i<results.size();i++){Log.v(TAG,"BSSID:"+results.get(i).BSSID);Log.v(TAG,"SSID:"+results.get(i).SSID);Log.v(TAG,"capabilities:"+results.get(i).capabilities);Log.v(TAG,"frequency:"+results.get(i).frequency);Log.v(TAG,"level:"+results.get(i).level);
}}
};
PermissionstoGetWiFi ScanResults(1)
Ref.CN5E,NT@UW,WUSTL26CS5530
• Android5.1(Lollipop,APIlevel22)orlowero PermissioninAndroidManifest.xml
} <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
} <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
PermissionstoGetWiFi ScanResults(2)
Ref.CN5E,NT@UW,WUSTL27CS5530
• AfterAndroid6.0(Marshmallow,APIlevel23)o AndroidManifest.xml permissionand runtimepermissionincode
o AndroidManifest.xml:} <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/><uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>or<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"/>
o Why?} KnowingnearbyWiFi hotspots(sameforBluetoothscans)conceptuallyislocation– arelativelocation.Fromtherelativelocationit’sbecomingeasiertogetanabsolutelocation
} https://code.google.com/p/android/issues/detail?id=185370
PermissionsonAndroid(1)
Ref.CN5E,NT@UW,WUSTL28CS5530
• AfterAndroid6.0,permissionsaredividedintotwocategorieso Normalpermissions
} Appneedstoaccessdataoutsidetheapp'ssandbox,butthere'sverylittlerisktotheuser'sprivacyortheoperationofotherapps.E.g.,permissiontousenetwork
PermissionsonAndroid(2)
Ref.CN5E,NT@UW,WUSTL29CS5530
• Normalpermissionso Ifanappdeclaresinmanifestthatitneedsanormalpermission,system
automaticallygrantspermissionatinstalltime
o Systemdoesnotpromptusertograntnormalpermissions,anduserscannotrevokethesepermissions(onlyuninstall)
o ACCESS_NETWORK_STATE
o ACCESS_WIFI_STATE
o BLUETOOTH
o CHANGE_NETWORK_STATE
o CHANGE_WIFI_STATE
o …..
PermissionsonAndroid(1)
Ref.CN5E,NT@UW,WUSTL30CS5530
• AfterAndroid6.0,permissionsaredividedintotwocategorieso Normalpermissions
} Appneedstoaccessdataoutsidetheapp'ssandbox,butthere'sverylittlerisktotheuser'sprivacyortheoperationofotherapps.E.g.,permissiontousenetwork
o Dangerouspermissions} Appwantsdatathatinvolveuser'sprivateinformation,orcouldpotentiallyaffectuser's
storeddataortheoperationofotherapps.E.g.,readuser'scontacts
} Ifmanifestfilelistsadangerouspermission,theuserhastoexplicitlygiveapprovaltoapp
PermissionsonAndroid(3)
Ref.CN5E,NT@UW,WUSTL31CS5530
• Dangerouspermissionso Apprequestspermissionsbothinmanifestand fromuseratruntime
(pop-upwindowlikeiOS)
o Usercanrevokepermissionsatanytime(inSettings>Apps),soappneedstocheckforpermissionseverytimeitruns
o READ/WRITE_CALENDAR
o CAMERA
o READ/WRITE_CONTACTS
o GET_ACCOUNTS
o ACCESS_FINE_LOCATION
o ….
PermissionsonAndroid(4)
Ref.CN5E,NT@UW,WUSTL32CS5530
• Viewinganapp'spermissionso Settings > Apps.Pickanappandscrolldowntoseethepermissionsthat
theappuses
o adb shellpmlistpermissions-s(allpermissions)
o adb shellpmlistpermissions-d-g(listpermissionsbygroup)
PermissionsatRunTime(1)
Ref.CN5E,NT@UW,WUSTL33CS5530
• Checkforpermissionso Ifappneedsadangerouspermission,codemustcheckeverytimeit
performsanoperationthatrequiresthispermission} Userisalwaysfreetorevokethepermission
o //thisActivity isthecurrentactivityint permissionCheck =ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);} Ifapphaspermission,themethodreturnsPackageManager.PERMISSION_GRANTED
} Ifappdoesnothavepermission,themethodreturnsPERMISSION_DENIED
PermissionsatRunTime(2)
Ref.CN5E,NT@UW,WUSTL34CS5530
• Requestpermissionso Ifappneedsadangerouspermissionthatwaslistedinthemanifest,it
mustaskusertograntthepermissionif(ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS)
!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(thisActivity,newString[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
PermissionstoGetWiFi ScanResults
Ref.CN5E,NT@UW,WUSTL35CS5530
• AndroidManifest.xmlo <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/><uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/>
• Codeo String[]PERMS_INITIAL={
Manifest.permission.ACCESS_FINE_LOCATION,};
if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,PERMS_INITIAL,MY_PERMISSIONS_REQUEST);}