国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android基于ibeacon實現藍牙考勤功能

2019-10-21 21:36:26
字體:
來源:轉載
供稿:網友

說明:

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增加考勤記錄

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 达日县| 古田县| 邵阳市| 南安市| 温泉县| 突泉县| 漳平市| 元谋县| 云龙县| 封开县| 康保县| 涪陵区| 靖江市| 克山县| 乌拉特前旗| 肃南| 大宁县| 卫辉市| 武平县| 杨浦区| 永善县| 永丰县| 乐业县| 八宿县| 玉屏| 海城市| 白山市| 兴化市| 健康| 黑山县| 蒙自县| 衡阳县| 饶阳县| 平和县| 麟游县| 隆林| 巢湖市| 莎车县| 当涂县| 西丰县| 呼图壁县|