当前位置是:帝豪2娱乐注册 > 新闻中心 > 新闻中心

手把手教你做蓝牙聊天应用(二)设计方案不积

来源:http://www.oieypxa.com 作者:隐痛 发布时间:2018-02-11 点击量:

  第2节 计划方案

  功效确定后,就要开始围绕功效举行功效的验证、界面计划的计划、以及步伐布局的计划了。

  2.1 技能验证

  选定了现阶段要完成的焦点功效后,我们起首必要对它们做技能上的验证,看看用什么样的要领能实现它们。在举行技能验证的同时,也能让我们发明许多我们在头脑风暴阶段没故意识到的实际题目。

  如今的手机和移动装备已经把蓝牙作为了尺度设置,它经常用到与周边小装备的数据毗连上,比方蓝牙自拍杆,蓝牙音箱,蓝牙键盘,活动手环等等,可以看出这都是一些不必要太大数据量传输而必要保持长时间数据通讯的装备。

  蓝牙技能从出现到如今颠末了多个版本,如今手机上最广泛的就是蓝牙4.0了。

  作为应用步伐的开辟者,实在并不必要知道许多与蓝牙技能相干的硬件知识。Google将软件开辟者会用到的全部蓝牙功效,都封装了起来,通过Android SDK提供应开辟者利用。以是,只要我们知道怎样利用Android SDK中提供的蓝牙接口函数就可以了。至于硬件是怎样实现的无线电波相互通讯,开辟者完全不必要去体贴。

  要操纵蓝牙装备,我们起首要获取操纵蓝牙装备的工具BluetoothAdapter,

  BluetoothAdapter BTAdapter=BluetoothAdapter.getDefaultAdapter();

  同时,还必要利用到三项体系权限,

  manifest xmlns:android="http://images.tuxi.com.cn/schemas.android.com/apk/res/android"

  package="com.anddle.anddlechat"

  uses-permission android:name="android.permission.BLUETOOTH" /

  uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /

  uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /

  ......

  /manifest

  之后我们就可以通过BluetoothAdapter对真实的蓝牙装备以及软件功效举行操纵利用了。

  2.1.1 装备发明

  一句简朴的“让装备相互连通”,现实上却包罗了许多隐蔽的使命。

  2.1.1.1 开启蓝牙

  用户并不肯定总是把蓝牙装备开启的,由于我们的应用要利用蓝牙,如果用户没有打开蓝牙装备,我们的步伐得打开它大概提示让用户自动打开它。

  有三种方法开启蓝牙功效,

  利用安卓体系提供的开关打开。比方,在设置- 蓝牙界面中打开,

  在应用中利用Intent启动确认窗口,让用户选择是否答应打开,

  BluetoothAdapter BTAdapter=BluetoothAdapter.getDefaultAdapter();

  //判定蓝牙功效是否打开

  if (!BTAdapter.isEnabled()) {

  //没有打开,就启动确认窗口扣问用户是否打开

  Intent i=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

  startActivity(i);

  }

  在应用中直接打开蓝牙功效,不必要扣问用户,

  BluetoothAdapter BTAdapter=BluetoothAdapter.getDefaultAdapter();

  //判定蓝牙功效是否打开

  if (!BTAdapter.isEnabled()) {

  ////没有打开,就直接打开

  BTAdapter.enable();

  }

  2.1.1.2 答应被发明

  蓝牙打开后,装备并不肯定可以或许别的蓝牙装备找到,出于宁静角度思量,许多装备的蓝牙开关纵然是打开的,也有大概克制让别的装备发明本身。

  为了保险起见,我们必要设置装备可以被别的蓝牙装备发明,

  利用BluetoothAdapter的getScanMode()要领,获取当前的蓝牙是否能被发明;

  通过BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE的Intent启动扣问窗口;

  BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION用来指定答应被发明的时间,比方,120就表现将来120秒内该蓝牙装备答应被别人发明;假如将该值设置成0,表现可以不停被发明;

  BluetoothAdapter BTAdapter=BluetoothAdapter.getDefaultAdapter();

  //判定黑白可以被发明

  if(BTAdapter.getScanMode() !=BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {

  //启动窗口,扣问用户是否可以设置成答应被发明

  Intent i=new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);

  //可以不停被别的蓝牙装备发明

  i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);

  startActivity(i);

  }

  上一篇:秒拍怎么添加好友?秒拍添加好友两种方法图文介绍

  2.1.1.3 搜刮可毗连装备

  搜刮可毗连的蓝牙装备,

  利用BluetoothAdapter的startDiscovery()要领开始搜素装备

  BluetoothAdapter mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

  //假如正在搜刮蓝牙装备,则制止搜刮

  if (mBluetoothAdapter.isDiscovering()) {

  mBluetoothAdapter.cancelDiscovery();

  //开始搜刮蓝牙装备

  mBluetoothAdapter.startDiscovery();

  当开始搜刮的时间,体系会发出一个BluetoothAdapter.ACTION_DISCOVERY_STARTED广播;

  当竣事搜刮的时间,体系会发出一个BluetoothAdapter.ACTION_DISCOVERY_FINISHED广播;

  当找到某个可毗连装备的时间,体系会发出一个BluetoothAdapter.ACTION_FOUND广播;并把可连装备的信息放在广播对应的Intent当中;

  因此,必要自界说一个BroadcastReceiver来吸收这些广播,

  private final BroadcastReceiver mReceiver=new BroadcastReceiver() {

  @Override

  public void onReceive(Context context, Intent intent) {

  String action=intent.getAction();

  if (BluetoothDevice.ACTION_FOUND.equals(action)) {

  //从Intent中获取可毗连的装备

  BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

  } else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {

  //开始搜刮了

  } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {

  //竣事搜刮了

  };

  吸收机接纳动态的方法,在应用启动的时间被注册,不利用的时间要注销,

  //注册吸收机

  IntentFilter filter=new IntentFilter();

  filter.addAction(BluetoothDevice.ACTION_FOUND);

  filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);

  filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

  registerReceiver(mReceiver, filter);

  ------------------------------------------

  //注销吸收机

  unregisterReceiver(mReceiver);

  2.1.1.4 搜刮效果展示

  应用必要一个搜刮四周可连装备的功效,它能把四周的装备搜刮出来,形成列表供用户选择,假如用户选择了某个装备,那么它就要去自动毗连这个装备。

  在设置- 蓝牙界面就有如许的展示,

  但是,我们自身的谈天应用也要有一个雷同的界面,方便用户选择装备,在同一个应用内就完成展示和毗连的功效。

  2.1.2 装备毗连

  蓝牙装备的毗连(wifi装备也是云云)可以分成自动毗连和被动毗连。

  装备的毗连是通过Socket-套结字实现的。所谓Socket就像它的英文意思“插座”一样,将两个差别的实体通过插口插座毗连起来。

  两个实体毗连起来后,就可以通过套结字来传送数据了。

  2.1.2.1 被动毗连

  应用假如不去自动发明四周装备,不自动去毗连别的装备,那它可以作为一个被动的担当者,等候别人的毗连。

  创建一个BluetoothServerSocket,必要给他指定一个名字和UUID。名字可以恣意指定,UUID就有肯定的学问了。利用雷同UUID的蓝牙应用,可以被相互发明。

  蓝牙装备的UUID可以分成两个大类,

  由蓝牙尺度同一划定的UUID。比方00001101-0000-1000-8000-00805F9B34FB这个UUID代表的就是蓝牙串口办事

  自界说UUID,蓝牙应用的开辟者可以本身“计划”一个UUID。这个UUID不能与已有划定的UUID雷同,只是为了将本身的蓝牙应用与别的蓝牙应用区离开。

  蓝牙的UUID观点有点像网络编程中的端标语。

  比方,根据划定,端标语23是分派给FTP办事利用的,别的FTP应用想要相互通讯,不消去猜对方的端标语是什么,只要知道协议中已经划定了23,各人都市服从就行,计划出来的应用绝不会有题目。

  上一篇:秒拍怎么添加好友?秒拍添加好友两种方法图文介绍

  开辟者也可以为本身的应用指定一个不着名的端标语,不必要和别的应用互通。

  这里我们就利用蓝牙串口办事的UUID

  BluetoothAdapter BluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

  final String BT_NAME="AnddleChat";

  final UUID BT_UUID=帝豪娱乐注册UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

  BluetoothServerSocket mServerSocket=mBluetoothAdapter.listenUsingRfcommWithServiceRecord(

  BT_NAME, BT_UUID);

  启动一个线程-叫它监听线程,在它当中,利用BluetoothServerSocket的accept()要领,等候别的装备的毗连;

  BluetoothSocket socket=mServerSocket.accept();

  这是一个壅闭的调用。就是说一旦实行accept()函数,它就不停等在那边,不会返回了。这也是要将等候毗连单独放到监听线程实行的缘故原由。

  假如accept()函数返回了,有两种大概,

  有别的装备向本身发出了毗连的哀求。accept()返回后,socket就是被毗连装备与毗连装备创建的Socket,这也正是步伐所不停等候的;

  mServerSocket的close()函数被调用,导致accept()抛出了非常,

  //别的地方封闭了BluetoothServerSocket

  mServerSocket.close()

  ----------------------------------

  //监听线程

  try {

  socket=mServerSocket.accept();

  } catch (IOException e) {

  //正在监听会抛出非常

  }

  颠末上面的流程,监听线程在收到别的蓝牙装备的毗连后,就得到了Socket。

  2.1.2.2 自动毗连

  蓝牙装备搜刮到四周的可毗连装备后,可以自动向它们提倡毗连哀求。

  通过对方的地点,获取蓝牙装备,

  BluetoothAdapter BluetoothAdapter=BluetoothAdapter.getDefaultAdapter();

  BluetoothDevice device=mBluetoothAdapter.getRemoteDevice(deviceAddr);

  创建可提倡毗连哀求的Socket,创建时要利用到UUID,提倡毗连的装备的UUID要与被动担当毗连的装备的UUID要雷同,就像是要把发送和担当调解到同样的频道上一样,

  final UUID BT_UUID=UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

  BluetoothSocket mSocket=device.createRfcommSocketToServiceRecord(BT_UUID);

  用connect()函数自动提倡毗连哀求,该函数是一个壅闭调用,不确定返回的时间,以是必要为它开启一个单独的线程实行,

  //事情线程中实行

  mSocket.connect();

  一旦实行乐成后,我们就得到了可以与别的蓝牙装备通讯的Socket。

  2.1.3 数据互换

  毗连创建以后,两边开始互换数据。无论是自动毗连照旧被动毗连,数据的互换都是通过之前得到的Socket举行的。

  获取读数据和发送数据的本领。Socket互换的数据都是以二进制的情势举行的。因此可以利用流的方法对数据举行操纵,

  InputStream mInStream=mSocket.getInputStream();

  OutputStream mOutStream=mSocket.getOutputStream();

  InputStream卖力读取从Socket传入的数据;

  OutputStream卖力将数据从Socket发送出去;

  接纳InputStream的read()要领读取数据。这是一个壅闭的要领,只有毗连的对方有数据传送过来的时间才会返回,并把传来的数据放在buffer参数当中,返回值代表读取的数据字节长度。

  读完一次以后,必要重复调用read()继承读取接下来的数据,这是一个循环的历程,

  //存放传入数据的数据区

  byte[] buffer=new byte[MAX_BUFFER_SIZE];

  //存放读取数据的字节长度

  int bytes;

  while (true) {

  try {

  //等候读取数据

  bytes=mInStream.read(buffer);

  } catch (IOException e) {

  //非常环境,比方Socket被封闭,对方断开毗连

  break;

  }

  上一篇:秒拍怎么添加好友?秒拍添加好友两种方法图文介绍

  作者:韩媛媛  来源:本站  点击:169  发布时间:2016-07-10 18:06:20




上一篇:保姆妈妈培养出美国总统未来奇迹将在中国发生

下一篇:零基础驯养一头程序猿:从入门到结婚(下)