蓝牙实战(二)
2016-03-11 21:47
330 查看
一.概述
这是蓝牙实战的第二篇,今天讲讲基本的操作,打开蓝牙可见性,查找设备,显示已绑定设备,先看效果图由于模拟器不支持蓝牙,所以没办法进行相应操作,大家下来可以到真机上测试一下,绝对没问题。
二.代码
1.BlueToothControllerpublic class BlueToothController { private BluetoothAdapter mAapter; public BlueToothController() { mAapter = BluetoothAdapter.getDefaultAdapter(); } /** * 打开蓝牙 * @param activity * @param requestCode */ public void turnOnBlueTooth(Activity activity, int requestCode) { Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); activity.startActivityForResult(intent, requestCode); // mAdapter.enable(); } /** * 打开蓝牙可见性 * @param context */ public void enableVisibly(Context context) { Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); context.startActivity(discoverableIntent); } /** * 查找设备 */ public void findDevice() { assert (mAapter != null); mAapter.startDiscovery(); } /** * 获取绑定设备 * @return */ public List<BluetoothDevice> getBondedDeviceList() { return new ArrayList<>(mAapter.getBondedDevices()); } }
2.DeviceAdapter
public class DeviceAdapter extends BaseAdapter { private List<BluetoothDevice> mData; private Context mContext; public DeviceAdapter(List<BluetoothDevice> data, Context context) { mData = data; mContext = context.getApplicationContext(); } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int i) { return mData.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { View itemView = view; //复用View,优化性能 if( itemView == null) { itemView = LayoutInflater.from(mContext).inflate(android.R.layout.simple_list_item_2,viewGroup,false); } TextView line1 = (TextView) itemView.findViewById(android.R.id.text1); TextView line2 = (TextView) itemView.findViewById(android.R.id.text2); //获取对应的蓝牙设备 BluetoothDevice device = (BluetoothDevice) getItem(i); //显示名称 line1.setText(device.getName()); //显示地址 line2.setText(device.getAddress()); return itemView; } public void refresh(List<BluetoothDevice> data) { mData = data; notifyDataSetChanged(); } }
3.MainActivity
public class MainActivity extends Activity { public static final int REQUEST_CODE = 0; private List<BluetoothDevice> mDeviceList = new ArrayList<>(); private List<BluetoothDevice> mBondedDeviceList = new ArrayList<>(); private BlueToothController mController = new BlueToothController(); private ListView mListView; private DeviceAdapter mAdapter; private Toast mToast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initActionBar(); setContentView(R.layout.activity_main); initUI(); IntentFilter filter = new IntentFilter(); //开始查找 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); //结束查找 filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); //查找设备 filter.addAction(BluetoothDevice.ACTION_FOUND); //设备扫描模式改变 filter.addAction(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED); //绑定状态 filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED); //注册广播 registerReceiver(mReceiver, filter); //打开蓝牙 mController.turnOnBlueTooth(this, REQUEST_CODE); } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); //开始查找 if( BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action) ) { setProgressBarIndeterminateVisibility(true); //初始化数据列表 mDeviceList.clear(); mAdapter.notifyDataSetChanged(); }//查找结束 else if( BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { setProgressBarIndeterminateVisibility(false); }//发现设备 else if( BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //找到一个,添加一个 mDeviceList.add(device); mAdapter.notifyDataSetChanged(); } else if( BluetoothAdapter.ACTION_SCAN_MODE_CHANGED.equals(action)) { int scanMode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE,0); if( scanMode == BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { setProgressBarIndeterminateVisibility(true); } else { setProgressBarIndeterminateVisibility(false); } } else if( BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action) ) { BluetoothDevice remoteDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if( remoteDevice == null ) { showToast("no device"); return; } int status = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,0); if( status == BluetoothDevice.BOND_BONDED) { showToast("Bonded " + remoteDevice.getName()); } else if( status == BluetoothDevice.BOND_BONDING){ showToast("Bonding " + remoteDevice.getName()); } else if(status == BluetoothDevice.BOND_NONE){ showToast("Not bond " + remoteDevice.getName()); } } } }; private void initUI() { mListView = (ListView) findViewById(R.id.device_list); mAdapter = new DeviceAdapter(mDeviceList, this); mListView.setAdapter(mAdapter); mListView.setOnItemClickListener(bindDeviceClick); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); } /** * 创建菜单布局 * @param menu * @return */ @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } private void showToast(String text) { if( mToast == null) { mToast = Toast.makeText(this, text, Toast.LENGTH_SHORT); } else { mToast.setText(text); } mToast.show(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.enable_visiblity) { mController.enableVisibly(this); } else if( id == R.id.find_device) { //查找设备 mAdapter.refresh(mDeviceList); mController.findDevice(); mListView.setOnItemClickListener(bindDeviceClick); } else if (id == R.id.bonded_device) { //查看已绑定设备 mBondedDeviceList = mController.getBondedDeviceList(); mAdapter.refresh(mBondedDeviceList); mListView.setOnItemClickListener(null); } return super.onOptionsItemSelected(item); } private AdapterView.OnItemClickListener bindDeviceClick = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { BluetoothDevice device = mDeviceList.get(i); device.createBond();//配对绑定 } }; private void initActionBar() { //在action的右边显示一个圆形进度条 requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); //显示icon而不显示logo,因为有时候会定义两个图标 getActionBar().setDisplayUseLogoEnabled(false); setProgressBarIndeterminate(true); try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class .getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false);//设置为true,则菜单从底部弹出,并且右上角不显示overflow按钮,设置为false, //则overflow按钮可见,并且从右上角显示按钮 } } catch (Exception e) { e.printStackTrace(); } } }
相关文章推荐
- Mac下MySQL卸载方法
- Unity的坑
- CSS清除浮动
- 多线程面试题
- JAVA程序练习---小车行走距离
- JAVA程序练习---小车行走距离
- JAVA程序练习---小车行走距离
- JAVA程序练习---小车行走距离
- JAVA程序练习---小车行走距离
- JAVA程序练习---小车行走距离
- JAVA程序练习---小车行走距离
- JAVA程序练习---小车行走距离
- CodeForces-630 D. Hexagons!【递推】
- 关于python3.4版本中的zip函数
- sench touch对list的store修改后checkbox选中问题
- 高并发集群架构超细精讲
- C语言实现二叉树的基本操作
- Opengl学习笔记1 -- 做一个透视立方体
- 类与继承总结
- 网上发现的一个stm32的I2C比较通俗易懂的入门例程。