Requirements: BLE connection and communication (do now-device on-search device-connect device)Resources: Some demos and official documents from the Web
:
1-ble is a Android4.3 version of the api-to provide some conceptual things or it is necessary to understand
At present, the Android real machine can only accept and control products-that is, the client side of the-server end is only a product-and Apple seems to be a mobile phone can be used as the receiving end can also be sent-
The basic concept is central and peripheral--the handset as the center--the product as the periphery--and both are connected by ble--
So I understand that the--gatt protocol for messaging is based on ATT--they contain a set of information that is server--there can be a lot of characti in the server ... And every feature is the constant information we need.
If there is something wrong with understanding it can be pointed out-after all, my understanding and cognition of this piece is only a few days-
2-Let's go to the formal lecture section below
App permissions Issue = = Call the Bluetooth device to claim permission = =
<span style= "FONT-SIZE:14PX;" ><uses-permission android:name= "Android.permission.BLUETOOTH"/><uses-permission android:name= " Android.permission.BLUETOOTH_ADMIN "/></span>
= = Sometimes the implementation of the various parts of our app is based on Bluetooth then we need to explain that the device is bluetooth only applicable = =
<span style= "FONT-SIZE:14PX;" ><uses-feature android:name= "Android.hardware.bluetooth_le" android:required= "true"/></ Span>
3-Building a new project-testbluetooth
Put out Mainactivity.java code.
Package Com.example.testbluetooth;import Java.util.arraylist;import Android.app.activity;import Android.app.listactivity;import Android.bluetooth.bluetoothadapter;import Android.bluetooth.bluetoothadapter.lescancallback;import Android.bluetooth.bluetoothdevice;import Android.bluetooth.bluetoothmanager;import Android.content.context;import Android.content.intent;import Android.content.pm.packagemanager;import Android.os.bundle;import Android.os.handler;import Android.util.Log; Import Android.view.layoutinflater;import android.view.menu;import android.view.menuitem;import Android.view.View; Import Android.view.viewgroup;import Android.widget.baseadapter;import Android.widget.listview;import Android.widget.textview;import Android.widget.toast;public class Mainactivity extends Listactivity {private final static String TAG = "Bluetoohth_test";p rivate ledevicelistadapter mledevicelistadapter;private bluetoothadapter Mbluetoothadapter;private Boolean mscanning;private Handler mhandler;private static Final int request_enable_bt = 1;//Stops scanning after seconds.private static final long scan_period = 10000; @Ov errideprotected void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate); Getactionbar (). Settitle (r.string.title_devices); mhandler = new Handler ();//Determine if BLELOG.I (TAG, "wheter_support_ble") is supported; Getpackagemanager (). Hassystemfeature (Packagemanager.feature_bluetooth_le)) {Toast.maketext (this, R.string.ble_ not_supported, Toast.length_short). Show (); Finish ();} LOG.I (TAG, "Get_about_ble_api"); final Bluetoothmanager Bluetoothmanager = (bluetoothmanager) Getsystemservi CE (context.bluetooth_service); Mbluetoothadapter = Bluetoothmanager.getadapter (); if (Mbluetoothadapter = = null) {Toast.maketext (this, r.string.error_bluetooth_not_supported, Toast.length_shor T). Show (); Finish (); Return }} @Overrideprotected void Onresume () {super.onresume ()/////For Bluetooth connection//ensures Bluetooth is EnabLED on the device. If Bluetooth is notlog.i (TAG, "connect_ble"); if (!mbluetoothadapter.isenabled ()) {if (!mbluetoothadapter.isenabled ()) {Intent enablebtintent = new Intent (bluetoothadapter.action_request_enable); Startactivityforresult (Enablebtintent, REQUEST_ENABLE_BT);}} Initializes list view Adapter.mledevicelistadapter = new Ledevicelistadapter (); Setlistadapter (Mledevicelistadapter ); Scanledevice (true);} /** * Real-time search for Bluetooth devices * devices are scanned every once and the device gets a prompt refresh-via Notifydatasetchange method * @author Admin * */private class Ledevicelistadap ter extends Baseadapter {private arraylist<bluetoothdevice> mledevices;private layoutinflater mInflator;public Ledevicelistadapter () {super (); mledevices = new arraylist<bluetoothdevice> (); minflator = MainActivity.this.getLayoutInflater ();} Add a device into the list of public void AddDevice (Bluetoothdevice device) {if (!mledevices.contains (device)) {Mledevices.add (device);}} Gets the corresponding device public bluetoothdevice getdevice (int position) {return mledevices.get (position) in the subkey;} Empty columnsTable Data public void Clear () {mledevices.clear ();} @Overridepublic int GetCount () {return mledevices.size ();} @Overridepublic Object getItem (int i) {return mledevices.get (i);} @Overridepublic long Getitemid (int i) {return i;} @Overridepublic View GetView (int i, view view, ViewGroup viewgroup) {Viewholder viewholder;//general ListView Optimizatio N code.if (view = null) {view = Minflator.inflate (R.layout.listitem_device, null); Viewholder = new Viewholder (); viewhold Er.deviceaddress = (TextView) View.findviewbyid (r.id.device_address); viewholder.devicename = (TextView) View.findviewbyid (R.id.device_name); View.settag (Viewholder);} else {Viewholder = (Viewholder) View.gettag ();} The corresponding devices are processed bluetoothdevice device = Mledevices.get (i); final String devicename = Device.getname (); if (devicename! = null & amp;& devicename.length () > 0) viewHolder.deviceName.setText (devicename); ElseviewHolder.deviceName.setText ( R.string.unknown_device); ViewHolder.deviceAddress.setText (Device.getaddress ()); return view;}}Static class Viewholder {TextView devicename; TextView deviceaddress;} /** * Scan device * @param enable */private void Scanledevice (Final Boolean enable) {if (enable) {//Stops SC Anning after a pre-defined scan period. Mhandler.postdelayed (New Runnable () {@Override public void run () {MScan ning = false; Mbluetoothadapter.stoplescan (Mlescancallback); Invalidateoptionsmenu (); }}, Scan_period); Mscanning = true; Mbluetoothadapter.startlescan (Mlescancallback); } else {mscanning = false; Mbluetoothadapter.stoplescan (Mlescancallback); } invalidateoptionsmenu ()///Update the menu bar information}//Scan to the Bluetooth device response settings Private Bluetoothadapter.lescancallback Mlescancallbac K = new Bluetoothadapter.lescancallback () {@Override public void Onlescan (final bluetoothdevice device, int rssi, byte[] Scanrecord) {Runonuithread (new Runnable () {@Override public void run () { Mledevicelistadapter.adddevice (device); Mledevicelistadapter.notifydatasetchanged (); } }); } }; @Override protected void OnPause () {super.onpause (); Scanledevice (FALSE); Mledevicelistadapter.clear (); }//the option to scan and pause @Override public boolean oncreateoptionsmenu (Menu menu) {getmenuinflater (). Inflate (r.menu.ma in, menu); if (!mscanning) {Menu.finditem (r.id.menu_stop). setvisible (false); Menu.finditem (R.id.menu_scan). setvisible (True); Menu.finditem (R.id.menu_refresh). Setactionview (NULL); } else {Menu.finditem (r.id.menu_stop). setvisible (True); Menu.finditem (R.id.menu_scan). setvisible (false); Menu.finditem (R.id.menu_refresh). Setactionview (R.layout.actionbar_indeterminate_progress); } return true; }//Click event @Override Public boolean onoptionsitemselected (MenuItem item) {switch (Item.getitemid ()) { Case R.id.menu_scan:mledevicelistadapter.clear (); Scanledevice (TRUE); Break Case R.id.menu_stop:scanledevice (FALSE); Break } return true; }/* Listen for events for each subkey * @see Android.app.listactivity#onlistitemclick (Android.widget.ListView, Android.view.Vie W, int, long) */@Override protected void Onlistitemclick (ListView l, View v, int position, long id) {fi NAL Bluetoothdevice device = mledevicelistadapter.getdevice (position); if (device = = null) return; Final Intent Intent = new Intent (this, devicecontrolactivity.class); Intent.putextra (Devicecontrolactivity.extras_device_name, Device.getname ()); Intent.putextra (Devicecontrolactivity.extras_devIce_address, Device.getaddress ()); if (mscanning) {Mbluetoothadapter.stoplescan (mlescancallback); Mscanning = false; } startactivity (Intent); } @Override protected void Onactivityresult (int requestcode, int resultcode, Intent data) {//User chose Not to enable Bluetooth. if (Requestcode = = Request_enable_bt && ResultCode = = activity.result_canceled) {finish (); Return } super.onactivityresult (Requestcode, ResultCode, data); }}
3.1-Post---Listitem_device.xml
</pre><pre name= "code" class= "java" ><pre name= "code" class= "HTML" ><?xml version= "1.0" encoding= "Utf-8"? ><linearlayout xmlns:android= "Http://schemas.android.com/apk/res/android" android:orientation = "vertical" android:layout_width= "match_parent" android:layout_height= "wrap_content" > < TextView android:id= "@+id/device_name" android:layout_width= "match_parent" android:layout_height= "Wrap_ Content " android:textsize=" 24DP "/> <textview android:id=" @+id/device_address " android:layout_ Width= "Match_parent" android:layout_height= "wrap_content" android:textsize= "12DP"/></ Linearlayout>
Not to be continued