亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android獲取ibeacon列表的方法

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

android獲取ibeacon列表,供大家參考,具體內容如下

最近公司有需要做ibeacon需求。

因為涉及掃碼的時間。特意寫一個service實現獲取列表 可以根據掃描時間掃描出ibeacon列表 
包含 uuid,設備名稱,單位(米),電量等。 
請根據自己的項目進行改造代碼。

核心代碼如下:

 

/** * * <ibeaon服務> * * @author fulushan * @date 創建時間:2018年4月5日 下午11:34:04 */public class IbeaconService extends Service {  private static final String TAG = IbeaconService.class.getName();  ArrayList<IBeaconClass.iBeacon> mLeDevices;  private boolean mScanning;  private final static int DATA_COMPLETE = 0;  private final static int DATA_FAIL = 1;  /**搜索BLE終端*/  private BluetoothAdapter mBluetoothAdapter;  // Stops scanning after 10 seconds.  private static long SCAN_PERIOD = 10000;  ResponseResult responseResult = new ResponseResult();  public class IbeaconBinder extends Binder{    public ResponseResult getResponseResult(){      return responseResult;    }  }  @Override  public IBinder onBind(Intent arg0) {    // TODO Auto-generated method stub    return null;  }  @Override  public void onStart(Intent intent, int startId) {    super.onStart(intent, startId);    if (intent != null) {      SCAN_PERIOD = intent.getIntExtra("time",10)*1000;      mLeDevices = new ArrayList<>();      //開啟一個新的線程,如果使用Service,會導致ANR問題,Service本身也會阻塞      new Thread(new IbeaconRunnable()).start();    }  }  @Override  public void onDestroy() {    super.onDestroy();    stopUpdateService();    scanLeDevice(false);  }  class IbeaconRunnable implements Runnable {    Message message = handler.obtainMessage();    public void run() {      try {        //獲取藍牙數據        //開始判斷        // Use this check to determine whether BLE is supported on the device. Then you can        // selectively disable BLE-related features.        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {          message.what = DATA_FAIL;          responseResult.setStatus(BlueToothEnum.BLU_SERVICE_UNAVAI.getCode());          responseResult.setMsg(BlueToothEnum.BLU_SERVICE_UNAVAI.getMsg());          message.obj = responseResult;          handler.sendMessage(message);          return;        }        if(Build.VERSION.SDK_INT<JELLY_BEAN_MR2){          responseResult.setStatus(BlueToothEnum.BLU_SERVICE_UNAVAI.getCode());          responseResult.setMsg(BlueToothEnum.BLU_SERVICE_UNAVAI.getMsg());          message.obj = responseResult;          handler.sendMessage(message);          return;        }        // Initializes a Bluetooth adapter. For API level 18 and above, get a reference to        // BluetoothAdapter through BluetoothManager.        final BluetoothManager bluetoothManager =            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {          mBluetoothAdapter = bluetoothManager.getAdapter();        }        if(!mBluetoothAdapter.isEnabled()){          responseResult.setStatus(BlueToothEnum.BLU_SERVICE_UNAVAI.getCode());          responseResult.setMsg(BlueToothEnum.BLU_SERVICE_UNAVAI.getMsg());          message.obj = responseResult;          handler.sendMessage(message);          return;        }        // Checks if Bluetooth is supported on the device.        if (mBluetoothAdapter == null) {          responseResult.setStatus(BlueToothEnum.BLU_SERVICE_UNAVAI.getCode());          responseResult.setMsg(BlueToothEnum.BLU_SERVICE_UNAVAI.getMsg());          message.obj = responseResult;          handler.sendMessage(message);          return;        }        //開啟藍牙        mBluetoothAdapter.enable();        scanLeDevice(true);      } catch (Exception ex) {        ex.printStackTrace();        message.what = DATA_FAIL;        //下載失敗        handler.sendMessage(message);      }    }  }  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)  private void scanLeDevice(final boolean enable) {    if (enable) {      // Stops scanning after a pre-defined scan period.      handler.postDelayed(new Runnable() {        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)        @Override        public void run() {          LogUtil.e(TAG,"scanLeDeviceStop");          mScanning = false;          mBluetoothAdapter.stopLeScan(mLeScanCallback);          Message message = handler.obtainMessage();          message.what = DATA_COMPLETE;          responseResult.setStatus(BlueToothEnum.SUCCESS.getCode());          responseResult.setMsg(BlueToothEnum.SUCCESS.getMsg());          responseResult.setData(mLeDevices);          message.obj = responseResult;          //數據數據完畢 更新數據列表          handler.sendMessage(message);        }      }, SCAN_PERIOD);      mScanning = true;      mBluetoothAdapter.startLeScan(mLeScanCallback);    } else {      mScanning = false;      mBluetoothAdapter.stopLeScan(mLeScanCallback);    }  }  public void addDevice(IBeaconClass.iBeacon device) {    if(device==null)      return;    for(int i=0;i<mLeDevices.size();i++){      String btAddress = mLeDevices.get(i).bluetoothAddress;      if(btAddress.equals(device.bluetoothAddress)){        mLeDevices.add(i+1, device);        mLeDevices.remove(i);        return;      }    }    mLeDevices.add(device);  }  // Device scan callback.  private BluetoothAdapter.LeScanCallback mLeScanCallback =      new BluetoothAdapter.LeScanCallback() {        @Override        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {          final IBeaconClass.iBeacon ibeacon = IBeaconClass.fromScanData(device,rssi,scanRecord);           LogUtil.e(TAG,"onLeScan");           addDevice(ibeacon);           if(!mScanning){             LogUtil.e(TAG,"!mScanning");           }        }      };  private Handler handler = new Handler() {    @Override    public void handleMessage(Message msg) {      switch (msg.what) {        case DATA_COMPLETE:          EventBus.getDefault().post(new BlueTeethEvent(responseResult));          //停止服務          stopUpdateService();          break;        case DATA_FAIL:          responseResult.setStatus(BlueToothEnum.OTHER_ERROR.getCode());          responseResult.setMsg(BlueToothEnum.OTHER_ERROR.getMsg());          EventBus.getDefault().post(new BlueTeethEvent(responseResult));          stopUpdateService();          break;        default:          // stopService(updateIntent);          // stopService(updateIntent);          // stopService(new Intent(UpdateService.this,UpdateService.class));          break;      }    }  };  private void stopUpdateService() {    Intent updateIntent = new Intent(getBaseContext(),IbeaconService.class);    updateIntent.setAction(ServiceHelper.IBEACON_SERVICE);    updateIntent.setPackage(getBaseContext().getPackageName());//這里你需要設置你應用的包名    stopService(updateIntent);  }}

調用方式:

/*** 開啟藍牙服務UpdateService*/  public static void startIbeacon(Context context,int time) {    Intent intent = new Intent(context,IbeaconService.class);    intent.putExtra("time", time);//掃描ibeacon時間    intent.setAction(IBEACON_SERVICE);    intent.setPackage(context.getPackageName());//這里你需要設置你應用的包名    context.startService(intent);  }

其中IBeacon類

 

/** * 代碼改自https://github.com/RadiusNetworks/android-ibeacon-service/blob/master/src/main/java/com/radiusnetworks/ibeacon/IBeacon.java * @author gvzhang * */public class IBeaconClass {  static public class iBeacon implements Serializable{    public String beaconName;    public int major;    public int minor;    public String uuid;    public String bluetoothAddress;    public int txPower;    public int rssi;    public double distance;  }  public static iBeacon fromScanData(BluetoothDevice device, int rssi,byte[] scanData) {    int startByte = 2;    boolean patternFound = false;    while (startByte <= 5) {      if (((int)scanData[startByte+2] & 0xff) == 0x02 &&        ((int)scanData[startByte+3] & 0xff) == 0x15) {             // yes! This is an iBeacon         patternFound = true;        break;      }      else if (((int)scanData[startByte] & 0xff) == 0x2d &&          ((int)scanData[startByte+1] & 0xff) == 0x24 &&          ((int)scanData[startByte+2] & 0xff) == 0xbf &&          ((int)scanData[startByte+3] & 0xff) == 0x16) {        iBeacon iBeacon = new iBeacon();        iBeacon.major = 0;        iBeacon.minor = 0;        iBeacon.uuid = "00000000-0000-0000-0000-000000000000";        iBeacon.txPower = -55;        return iBeacon;      }      else if (((int)scanData[startByte] & 0xff) == 0xad &&           ((int)scanData[startByte+1] & 0xff) == 0x77 &&           ((int)scanData[startByte+2] & 0xff) == 0x00 &&           ((int)scanData[startByte+3] & 0xff) == 0xc6) {          iBeacon iBeacon = new iBeacon();          iBeacon.major = 0;          iBeacon.minor = 0;          iBeacon.uuid = "00000000-0000-0000-0000-000000000000";          iBeacon.txPower = -55;          return iBeacon;      }      startByte++;    }    if (patternFound == false) {      // This is not an iBeacon      return null;    }    iBeacon iBeacon = new iBeacon();    iBeacon.major = (scanData[startByte+20] & 0xff) * 0x100 + (scanData[startByte+21] & 0xff);    iBeacon.minor = (scanData[startByte+22] & 0xff) * 0x100 + (scanData[startByte+23] & 0xff);    iBeacon.txPower = (int)scanData[startByte+24]; // this one is signed    iBeacon.rssi = rssi;    iBeacon.distance = calculateAccuracy(iBeacon.txPower,iBeacon.rssi);    // AirLocate:    // 02 01 1a 1a ff 4c 00 02 15 # Apple's fixed iBeacon advertising prefix    // e2 c5 6d b5 df fb 48 d2 b0 60 d0 f5 a7 10 96 e0 # iBeacon profile uuid    // 00 00 # major     // 00 00 # minor     // c5 # The 2's complement of the calibrated Tx Power    // Estimote:        // 02 01 1a 11 07 2d 24 bf 16     // 394b31ba3f486415ab376e5c0f09457374696d6f7465426561636f6e00000000000000000000000000000000000000000000000000    byte[] proximityUuidBytes = new byte[16];    System.arraycopy(scanData, startByte+4, proximityUuidBytes, 0, 16);     String hexString = bytesToHexString(proximityUuidBytes);    StringBuilder sb = new StringBuilder();    sb.append(hexString.substring(0,8));    sb.append("-");    sb.append(hexString.substring(8,12));    sb.append("-");    sb.append(hexString.substring(12,16));    sb.append("-");    sb.append(hexString.substring(16,20));    sb.append("-");    sb.append(hexString.substring(20,32));    iBeacon.uuid = sb.toString();    if (device != null) {      iBeacon.bluetoothAddress = device.getAddress();      iBeacon.beaconName = device.getName();    }    return iBeacon;  }  private static String bytesToHexString(byte[] src){     StringBuilder stringBuilder = new StringBuilder("");     if (src == null || src.length <= 0) {       return null;     }     for (int i = 0; i < src.length; i++) {       int v = src[i] & 0xFF;       String hv = Integer.toHexString(v);       if (hv.length() < 2) {         stringBuilder.append(0);       }       stringBuilder.append(hv);     }     return stringBuilder.toString();   }  /**   * 估算用戶設備到ibeacon的距離   *   * @param txPower   * @param rssi   * @return   */  public static double calculateAccuracy(int txPower, double rssi) {    if (rssi == 0) {      return -1.0; // if we cannot determine accuracy, return -1.    }    double ratio = rssi * 1.0 / txPower;    if (ratio < 1.0) {      return Math.pow(ratio, 10);    } else {      double accuracy = (0.89976) * Math.pow(ratio, 7.7095) + 0.111;      return accuracy;    }  }}

缺少的類請自己補全。請根據自己的項目進行改造代碼。

{  "msg": "獲取數據成功",  "data": [{      "uuid": "11111",      "beaconName": "設備A",      "distance": 0.56    },    {      "uuid": "2222",      "beaconName": "設備B",      "distance": 1.56    }  ],  "status": 100}

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩精品| 亚洲美女激情视频| 成人啪啪免费看| 国产一区二区三区网站| 久久影视电视剧免费网站| 欧美最猛性xxxx| 欧美天天综合色影久久精品| 插插插亚洲综合网| 久久久999国产精品| 福利一区福利二区微拍刺激| 最近2019中文免费高清视频观看www99| 国产suv精品一区二区三区88区| 神马久久桃色视频| 亚洲午夜未满十八勿入免费观看全集| 精品成人在线视频| 国产精品一久久香蕉国产线看观看| 国产一区二区三区在线视频| 日韩中文字幕免费视频| 亚洲色图国产精品| 亚洲欧洲中文天堂| 中日韩午夜理伦电影免费| 精品国产一区二区三区四区在线观看| 91精品国产99久久久久久| 久久五月天综合| 中文字幕免费国产精品| 最新国产精品拍自在线播放| 亚洲视频网站在线观看| 中文欧美日本在线资源| 国产拍精品一二三| 欧美精品videossex88| 国产精品国产亚洲伊人久久| 亚洲福利视频二区| 亚洲三级av在线| 激情av一区二区| 97碰碰碰免费色视频| 69视频在线免费观看| 亚洲欧美精品在线| 成人欧美一区二区三区黑人| 欧美视频第一页| 91精品视频免费看| 色在人av网站天堂精品| 日韩精品高清在线| 亚洲人成网站777色婷婷| 午夜精品久久久久久99热软件| 北条麻妃一区二区三区中文字幕| 亚洲xxxx妇黄裸体| 欧美激情第一页xxx| 91免费视频网站| 国产亚洲欧洲黄色| 91久久综合亚洲鲁鲁五月天| 日韩av一区在线| 97精品国产97久久久久久| 日韩在线视频播放| 91精品视频网站| 欧美日韩一区免费| 久久天天躁狠狠躁夜夜躁| 亚洲国产中文字幕在线观看| 欧美小视频在线| 亚洲最大的成人网| 国产精品爱久久久久久久| 日韩电视剧免费观看网站| 国产欧美一区二区| 国产成人精品日本亚洲专区61| 亚洲精品久久久久中文字幕二区| 欧美视频在线免费| 欧美激情一级欧美精品| 伊人男人综合视频网| 精品国产区一区二区三区在线观看| 亚洲毛片一区二区| 亚洲精品免费在线视频| 国产精品美女无圣光视频| 懂色aⅴ精品一区二区三区蜜月| 国产精品美女av| 日韩欧美综合在线视频| 成人午夜激情免费视频| 韩剧1988免费观看全集| 亚洲精品456在线播放狼人| 伊人伊人伊人久久| 91久久精品久久国产性色也91| 日韩av123| 亚洲国产又黄又爽女人高潮的| 国产欧美一区二区三区四区| 亚洲国产精品人人爽夜夜爽| 欧美激情免费在线| 国产精品成人av在线| 国产精品永久免费观看| 亚洲区中文字幕| 成人高清视频观看www| 日韩精品在线观看视频| 国产区精品在线观看| 国产主播在线一区| 久久久久国产一区二区三区| 国产精品久久久久久影视| 777国产偷窥盗摄精品视频| 亚洲成人动漫在线播放| 亚洲第一精品夜夜躁人人躁| 国产精品影院在线观看| 亚洲国产精品久久久久久| 欧美最猛性xxxxx(亚洲精品)| 欧美有码在线观看| 在线成人中文字幕| 久久久国产精彩视频美女艺术照福利| 在线观看精品国产视频| 国产视频自拍一区| 久久91精品国产| 亚洲男人av电影| 欧美激情一区二区三区在线视频观看| 欧美精品在线视频观看| 久久伊人精品一区二区三区| 欧美亚洲视频在线观看| 91精品国产91久久久久福利| 北条麻妃一区二区三区中文字幕| 中文字幕久精品免费视频| 欧美成人激情视频免费观看| 亚洲影院色在线观看免费| 懂色av中文一区二区三区天美| 97香蕉久久夜色精品国产| 国产精品久久久久久av福利软件| 国产欧美日韩精品专区| 日韩成人在线视频观看| 日韩免费中文字幕| 青青草国产精品一区二区| 日本久久亚洲电影| 欧美午夜丰满在线18影院| 日韩欧美综合在线视频| 国语自产精品视频在线看抢先版图片| 久久精品欧美视频| 亚洲天堂开心观看| 国产午夜精品视频免费不卡69堂| 狠狠色狠狠色综合日日小说| 久久的精品视频| 日韩av电影手机在线观看| 97高清免费视频| 亚洲小视频在线| 国产成人a亚洲精品| 538国产精品视频一区二区| 日韩中文字幕在线观看| 欧美精品做受xxx性少妇| 欧美理论在线观看| 在线国产精品播放| 亚洲美女免费精品视频在线观看| 国产精品嫩草视频| 精品成人av一区| 中文字幕在线国产精品| 欧美国产亚洲精品久久久8v| 久久久久久69| 92看片淫黄大片欧美看国产片| 免费av一区二区| 亚洲伊人久久综合| 欧美成人精品xxx| 亚洲欧美制服综合另类| 中文字幕亚洲综合| 日韩成人av网| 最近2019中文字幕mv免费看| 精品美女永久免费视频| 5252色成人免费视频| 亚洲a中文字幕| 尤物yw午夜国产精品视频| 欧美在线播放视频| 欧美大成色www永久网站婷| 中文字幕日韩精品在线观看| 欧美日产国产成人免费图片| 亚洲美女性视频| 欧美日韩综合视频网址|