当前位置: 移动技术网 > IT编程>移动开发>Android > Android基于ibeacon实现蓝牙考勤功能

Android基于ibeacon实现蓝牙考勤功能

2019年08月01日  | 移动技术网IT编程  | 我要评论

dw2xls,精彩资讯网,易虎臣叶雪

说明:

ibeacon设备会主动发射蓝牙信号,当手机打开蓝牙靠近ibeacon设备时,就会收到设备发送的蓝牙信号,这时只需要根据ibeacon设备的uuid、major、minor、mac这四个值,就可以确认是哪一台ibeacon设备,然后调用服务端考勤接口(ibeacon设备只为了确认手机在考勤机边上,不需要发送考勤数据到ibeacon设备上),即可实现蓝牙考勤。

一、添加静态权限(在androidmanifest.xml文件中添加,需要蓝牙和定位权限)

<uses-permission android:name="android.permission.access_coarse_location" />
<uses-permission android:name="android.permission.access_fine_location" />
<uses-permission android:name="android.permission.bluetooth_admin" />
<uses-permission android:name="android.permission.bluetooth" />

二、检测与开启蓝牙、gps

1.是否支持蓝牙:

 if (!context.getpackagemanager().hassystemfeature(packagemanager.feature_bluetooth_le)) {
      toastutils.show("本机不支持蓝牙功能, 无法蓝牙打卡");
      ((activity) context).finish();
      return false;
    }
    final bluetoothmanager bm = (bluetoothmanager) context.getsystemservice(context.bluetooth_service);
    if (build.version.sdk_int >= build.version_codes.jelly_bean_mr2) {
      mbleadapter = bm.getadapter(); //mbleadapter为全局变量,为bluetoothadapter对象
    }
    if (bleadapter == null) {
      toastutils.show("本机不支持低功耗蓝牙功能, 无法蓝牙打卡");
      ((activity) context).finish();
      return false;
    }
    return true;

2.是否开启gps:

locationmanager lm = (locationmanager) context.getsystemservice(context.location_service);
boolean gps = lm.isproviderenabled(locationmanager.gps_provider);
boolean network = lm.isproviderenabled(locationmanager.network_provider);
if (gps || network) {
   return true;
}
return false;

3.开启gps:

intent intent = new intent(settings.action_location_source_settings);
context.startactivityforresult(intent, activitycode.activity_code_gps);

4.开启蓝牙:

intent enablebtintent = new intent(bluetoothadapter.action_request_enable);
((activity) mcontext).startactivityforresult(enablebtintent, activitycode.activity_code_open_ble);

三、动态申请蓝牙权限

private boolean check(context context, string permission) {
    return contextcompat.checkselfpermission(context, permission) == packagemanager.permission_granted;
 
  }
 
  /**
   * 权限申请
   */
  private void searchble(){
    if (build.version.sdk_int >= build.version_codes.m) {
      if (!check(mcontext, manifest.permission.access_fine_location) || !check(mcontext, manifest.permission.access_coarse_location)) {
        activitycompat.requestpermissions(this, new string[]{manifest.permission.access_fine_location, manifest.permission.access_coarse_location}, access_location);
      } else {
        //执行蓝牙搜索
      }
    } else {
      //执行蓝牙搜索
    }
  }
 
  @override
  public void onrequestpermissionsresult(int requestcode, string[] permissions, int[] grantresults) {
    switch (requestcode) {
      case access_location:
        if (hasallpermissionsgranted(grantresults)) {
          //执行蓝牙搜索
        } else {
          toastutils.show("请开启权限");
        }
        break;
    }
  }

四.搜索蓝牙

 /**
 * 搜索蓝牙
*/
  public void searchble() {
    if (build.version.sdk_int >= build.version_codes.jelly_bean_mr2) {
      mbleadapter.startlescan(mlescancallback);
    }
  }
 
  /**
   * 搜索结果回调
   */
  private bluetoothadapter.lescancallback mlescancallback = new bluetoothadapter.lescancallback() {
 
    @override
    public void onlescan(final bluetoothdevice device, int rssi, byte[] scanrecord) {
      //fromscandata方法将ibeacon数据转换为实体对象,内部包括了uuid、major、minor、mac、distance等信息
      final bleutil.deviceinfo info = bleutil.fromscandata(device, rssi, scanrecord);
      if (info == null || textutils.isempty(info.uuid) || info.major <= 0 || info.minor <= 0 || textutils.isempty(info.mac)) {
        return;
      }
      if (muuids == null || muuids.isempty()) {
        //此处关闭蓝牙搜索
        mbleadapter.stoplescan(mlescancallback);
        return;
      }
      for (machineinfo machineinfo : muuids) {
        if (info.uuid.equalsignorecase(machineinfo.uuid) &&
            (!textutils.isempty(machineinfo.major) && info.major == integer.parseint(machineinfo.major)) &&
            (!textutils.isempty(machineinfo.minor) && info.minor == integer.parseint(machineinfo.minor)) &&
            info.mac.equalsignorecase(machineinfo.mac) && info.distance <= max_distance) {
          mconnected = true;
          //回调通知外部,界面更新可考勤状态
          if (mlistener != null) {
            mlistener.onconnected();
          }
          //此处是延时调用stoplescan关闭蓝牙搜索
          begintimer();
          break;
        }
      }
    }
  };

五、考勤

此步调用服务端提供的api增加考勤记录

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网