Obsah Bluetooth BluetoothAdapter Síťová připojení ConnectivityManager Wireless Lan WifiManager Hlasový vstup Speech Input Přehrávač médií Media Player Schránka 2
3 Bluetooth Navrženo pro krátké vzdálenosti Nízká rychlost přenosu, relativně nízká spotřeba baterie Knihovna dostupná od verze 2.0 (SDK API 5) Od verze 2.1 je v Androidu povolena pouze šifrovaná komunikace Komunikace pouze mezi spárovanými zařízeními Spravováno pomocí následujících tříd: BluetoothAdapter BluetoothDevice BluetoothSocket BluetoothServerSocket Nevýhoda Nelze emulovat (pro testování jsou třeba aspoň dvě fyzická zařízení)
4 BluetoothAdapter Základní operace Vyhledávání jiných zažízení s Bluetooth Dotazování spárovaných zařízení Inicializace BluetoothDevice BluetoothServerSocket Čtení vlastností, zahájení vyhledávání zařízení, nalezení spárovaných zařízení: <uses-permission android:name="android.permission.bluetooth"/> Úprava nastavení: <uses-permission android:name="android.permission.bluetooth_admin"/> Získání BluetoothAdapteru: BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
5 BluetoothAdapter - vlastnosti setname(string name) Nastavení uživatelského jména adaptéru getstate() Současný stav adaptéru BluetoothAdapter.STATE_TURNING_ON BluetoothAdapter.STATE_ON BluetoothAdapter.STATE_TURNING_OFF BluetoothAdapter.STATE_OFF Enable()/Disble() Povolení/Zakázání Bluetooth Nutné oprávnění: android.permission.bluetooth_admin getbondeddevices() Vrací spárovaná zařízení
6 BluetoothAdapter - ukázka BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); String toasttext; if (bluetooth.isenabled()) { String address = bluetooth.getaddress(); String name = bluetooth.getname(); toasttext = name + " : " + address; else { toasttext = "Bluetooth is not enabled"; String enablebt = BluetoothAdapter.ACTION_REQUEST_ENABLE; startactivityforresult(new Intent(enableBT), 0); Toast.makeText(v.getContext(), toasttext, Toast.LENGTH_SHORT).show(); Pokud je bluetooth vypnuté, nabídneme uživateli povolení (přes systém. sub-activitu) Pozn.: Vzhledem k tomu, že povolení BT je poměrně časově náročná operace, je lepší ji vykonávat asynchronně, nejlépe přes BroadcastReceiver.
7 Zjistitelnost bluetooth zařízení (Discoverability) Z bezpečnostních důvodů je zařízení defaultně nezjistitelné Definováno pomocí konstant BluetoothAdapteru BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE Zjistitelné jakýmkoli zařízením BluetoothAdapter.SCAN_MODE_CONNECTABLE Zjistitelné pouze zařízeními dříve spárovanými BluetoothAdapter.SCAN_MODE_NONE Nezjistitelné getscanmode() Vrátí aktuální scan mode
8 Zapnutí zjistitelnosti zařízení Pomocí Intentu zažádáme uživatele o povolení zjištění zařízení Defaultně nastaveno s timeoutem 120 sekund lze změnit BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION String adiscoverable = BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE; startactivityforresult(new Intent(aDiscoverable), DISCOVERY_REQUEST); @Override protected void onactivityresult(int requestcode, int resultcode, Intent data) { if (requestcode == DISCOVERY_REQUEST) { boolean isdiscoverable = resultcode > 0; int discoverableduration = resultcode;
9 Hledání jiných zařízení s bluetooth startdiscovery() Zahájí proces hledání jiných zařízení isdiscovering() Vrátí true pokud zařízení aktuálně vyhledává jiná zařízení canceldiscovery() Zruší vyhledávání jiných zařízení Broadcast intenty BluetoothAdapter.ACTION_DISCOVERY_STARTED BluetoothAdapter.ACTION_DISCOVERY_FINISHED Vhodné pro monitorování změn při procesu hledání jiných zařízení (přes BroadcastReceiver)
10 Nalezení jiného zařízení s bluetooth BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); BroadcastReceiver discoveryresult = new BroadcastReceiver() { @Override public void onreceive(context context, Intent intent) { String remotedevicename = intent.getstringextra(bluetoothdevice.extra_name); BluetoothDevice remotedevice; remotedevice = intent.getparcelableextra(bluetoothdevice.extra_device); Toast.makeText(v.getContext(), "Discovered: " + remotedevicename, Toast.LENGTH_SHORT).show(); ; registerreceiver(discoveryresult, new IntentFilter(BluetoothDevice.ACTION_FOUND)); if (!bluetooth.isdiscovering()) bluetooth.startdiscovery();
11 Komunikace přes bluetooth Funguje nad protokolem RFCOMM Otevření socketu mezi dvěma spárovanými zařízeními Přes Bluetooth API nelze spárovat zařízení Je třeba k tomu vyzvat uživatele o to se sám postará systém při navazování spojení u nespárovaných zařízení Rozhraní socketů velmi podobné TCP Socket, ServerSocket BluetoothServerSocket Naslouchající socket Po navázání spojení vrací BluetoothSocket BluetoothSocket Klientský přípojený nebo připojující se socket UUID Jedinečný identifikátor aplikace (128 bit) Možno vygenerovat pomocí UUID.randomUUID() listenusingrfcommwithservicerecord (String name, UUID uuid) Vytvoření naslouchajícího zabezpečeného RFCOMM socketu
12 Jednoduchý bluetooth server private class AcceptThread extends Thread { private final BluetoothServerSocket mmserversocket; public AcceptThread() { BluetoothServerSocket tmp = null; try { tmp = mbluetoothadapter.listenusingrfcommwithservicerecord(name, MY_UUID); catch (IOException e) { mmserversocket = tmp; public void run() { BluetoothSocket socket = null; Blokující metoda while (true) { try { socket = mmserversocket.accept(); catch (IOException e) { break; if (socket!= null) { Něco provedeme se získaným manageconnectedsocket(socket); mmserversocket.close(); socketem break; public void cancel() { try { mmserversocket.close(); catch (IOException e) {
13 Jednoduchý bluetooth klient private class ConnectThread extends Thread { private final BluetoothSocket mmsocket; private final BluetoothDevice mmdevice; public ConnectThread(BluetoothDevice device) { BluetoothSocket tmp = null; mmdevice = device; try { tmp = device.createrfcommsockettoservicerecord(my_uuid); catch (IOException e) { mmsocket = tmp; Zrušíme zjišťování jiných zařízení public void run() { mbluetoothadapter.canceldiscovery(); Blokující metoda (pokud proběhne try { mmsocket.connect(); bez vyjímky, spojení je navázané) catch (IOException connectexception) { try { mmsocket.close(); catch (IOException closeexception) { return; manageconnectedsocket(mmsocket); public void cancel() { try { mmsocket.close(); catch (IOException e) {
14 Přenos dat pomocí BluetoothSocket private class ConnectedThread extends Thread { private final BluetoothSocket mmsocket; private final InputStream mminstream; private final OutputStream mmoutstream; public ConnectedThread(BluetoothSocket socket) { mmsocket = socket; InputStream tmpin = null; OutputStream tmpout = null; try { tmpin = socket.getinputstream(); tmpout = socket.getoutputstream(); catch (IOException e) { public void write(byte[] bytes) { mminstream = tmpin; try { mmoutstream.write(bytes); mmoutstream = tmpout; catch (IOException e) { public void run() { public void cancel() { byte[] buffer = new byte[1024]; try { mmsocket.close(); int bytes; catch (IOException e) { while (true) { try { bytes = mminstream.read(buffer); mhandler.obtainmessage(message_read, bytes, -1, buffer).sendtotarget(); catch (IOException e) { break;
15 Správa síťových připojení Internet se stává jednou z nejdůležitějších funkcí mobilního telefonu Android prakticky bez internetového připojení nemá smysl Technologie Wifi, GPRS, 3G, 4G ConnectivityManager Služba Monitoruje stavy připojení Vysílá broadcast intenty Nastavuje preferovaná síťová připojení Zprostředkovává API pro dotazovaní na stavy připojení Oprávnění: <uses-permission android:name="android.permission.access_network_state"/> <uses-permission android:name="android.permission.change_network_state"/>
16 ConnectivityManager NetworkInfo Status připojení Typ připojení Detailní stav připojení getactivenetworkinfo() Informace o aktuálním připojení getnetworkinfo(int networktype) Informace o konkrétním typu připojení getbackgrounddatasetting() Vrátí zda jsou povolena data na pozadí ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_ CHANGED Broadcast intent vysílaný při změně nastavení,,dat na pozadí
17 Monitorování síťového připojení ConnectivityManager.CONNECTIVITY_ACTION Broadcast intent vysílaný při změně síťového připojení Intent extras ConnectivityManager.EXTRA_EXTRA_INFO Dodatečné informace o stavu připojení ConnectivityManager.EXTRA_IS_FAILOVER ConnectivityManager.EXTRA_NETWORK_INFO NetworkInfo připojené sítě ConnectivityManager.EXTRA_NO_CONNECTIVITY Boolean hodnota nedostupnosti připojení ConnectivityManager.EXTRA_OTHER_NETWORK_INFO NetworkInfo případné jiné sítě, ke které by se mohlo jít připojit ConnectivityManager.EXTRA_REASON Informace o případném selhání pokusu o připojení
18 ConnectivityManager - příklad ConnectivityManager connectivitymanager; NetworkInfo wifiinfo, mobileinfo; TextView text; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); text = (TextView) findviewbyid(r.id.textstatus); connectivitymanager = (ConnectivityManager) getsystemservice(context.connectivity_service); wifiinfo = connectivitymanager.getnetworkinfo(connectivitymanager.type_wifi); mobileinfo = connectivitymanager.getnetworkinfo(connectivitymanager.type_mobile); text.append(wifiinfo.tostring() + "\n\n"); text.append(mobileinfo.tostring());
19 Wireless LAN Spravováno pomocí WifiManager Konfigurace a správa wifi připojení Hledání přístupových bodů Monitorování změn wifi připojení Kompletní kontrola nad konfigurací každé Wifi sítě Stavy wifi sítě WifiManager.WIFI_STATE_DISABLED WifiManager.WIFI_STATE_DISABLING WifiManager.WIFI_STATE_ENABLED WifiManager.WIFI_STATE_ENABLING WifiManager.WIFI_STATE_UNKNOWN Oprávnění: <uses-permission android:name="android.permission.access_wifi_state" /> <uses-permission android:name="android.permission.change_wifi_state" />
20 WifiManager broadcast intenty WifiManager.WIFI_STATE_CHANGED_ACTION Vysláno po změně stavu hardwaru zapnutí, zapínání, vypnutí, vypínání, neznámý WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION Vysláno při změně stavu připojení aktuálního přístupového bodu Při navázání a zrušení spojení WifiManager.NETWORK_STATE_CHANGED_ACTION Vysláno při změně stavu připojení Extras WifiManager.EXTRA_NETWORK_INFO detaily o stavu připojení v NetworkInfo WifiManager.EXTRA_BSSID BSSID připojeného přístupového bodu WifiManager.RSSI_CHANGED_ACTION Extra - WifiManager.EXTRA_NEW_RSSI Obsahuje aktuální sílu signálu
21 Skenování dostupných přístupových bodů a jejich výpis do EditTextu final WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onreceive(context context, Intent intent) { EditText edit = (EditText) findviewbyid(r.id.edittext1); edit.settext(null); String newline = System.getProperty("line.separator"); List<ScanResult> results = wifi.getscanresults(); for (ScanResult result : results) { edit.append(result.tostring() + newline); unregisterreceiver(this); ; registerreceiver(receiver, new IntentFilter( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); wifi.startscan();
22 Rozpoznání hlasového vstupu (Speech Input) Umožňuje diktovat text Je potřeba mít na nainstalovanou aplikaci, která je zaregistrovaná na RecognizerIntent Na většině zařízení je předinstalovaný Voice Search od Googlu (lze stáhnout i z Marketu) Voice Search se komunikuje se servery Googlu, kde probíhá rozpoznání hlasu Zařízení musí být připojeno k internetu Umí i češtinu
23 Rozpoznání hlasového vstupu Implementace je pomocí startactivityforresult 2 módy LANGUAGE_MODEL_FREE_FORM nastavíme, pokud se jedná o volný text (např. diktování SMS) LANGUAGE_MODEL_WEB_SEARCH použijeme pro krátké termíny (hledání na webu) Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); //Nastaveni, zda se jedna o hledani (LANGUAGE_MODEL_WEB_SEARCH) nebo volny text intent.putextra(recognizerintent.extra_language_model, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); //Text, ktery se zobrazi pri diktovani intent.putextra(recognizerintent.extra_prompt, "Speech Input Test"); startactivityforresult(intent, VOICE_RECOGNITION);
24 Rozpoznání hlasového vstupu Speech Input aplikace vrátí List s výsledky Uživateli z nich můžeme nechat vybrat a nebo použijeme 1. v pořadí @Override protected void onactivityresult(int requestcode, int resultcode, Intent data) { if (requestcode == VOICE_RECOGNITION && resultcode == RESULT_OK) { // Ziskani vysledku z Extra pole Intentu ArrayList<String> matches = data.getstringarraylistextra( RecognizerIntent.EXTRA_RESULTS);... super.onactivityresult(requestcode, resultcode, data);
Přehrávač médií (MediaPlayer) Umožňuje přehrávání většiny běžných multimediálních formátů MediaPlayer přehraje soubory z těchto míst: Složka res/raw/ ve vaší aplikaci Filesystem zařízení Internet (streaming) 25
26 Přehrávač médií Raw resource v.apk MediaPlayer mediaplayer = MediaPlayer.create(context, R.raw.song); mediaplayer.start(); Filesystem, Internet Uri uri = Uri.fromFile(new File("/sdcard/Music/song.mp3")); Uri uri = Uri.parse("http://www.example.com/song.mp3"); mediaplayer = new MediaPlayer(); mediaplayer.setaudiostreamtype(audiomanager.stream_music); mediaplayer.setdatasource(context, uri); mediaplayer.prepare(); mediaplayer.start();
27 Přehrávač médií Pro video musíme mít SurfaceView, do kterého se bude vykreslovat, jinak se přehraje pouze audio <SurfaceView android:id="@+id/surfaceview1" android:layout_width="match_parent" android:layout_height="match_parent" /> SurfaceView sv= (SurfaceView) findviewbyid(r.id.surfaceview1); SurfaceHolder videoholder = sv.getholder(); videoholder.settype(surfaceholder.surface_type_push_buffers); Uri uri = Uri.fromFile(new File("/sdcard/Video/video.mp4")); mediaplayer.setaudiostreamtype(audiomanager.stream_music); mediaplayer.setdatasource(context, uri); mediaplayer.setdisplay(videoholder); mediaplayer.prepare(); mediaplayer.start();
28 Schránka Android API poskytuje framework pro kopírování a vkládání textu Systémová služba => referenci získáme pomocí (ClipboardManager) getsystemservice(clipboard_service); Vložení textu do schránky pak provedeme příkazem clipboardmanager.settext("text"); Získání textu ze schránky text = clipboardmanager.gettext().tostring(); String
A to nelepší nakonec! Funguje pouze na Gingerbread Rychle a opakovaně klikejte na,,verze systému Android 29