2017-10-04 55 views
2

我使用了altbeacon提供的参考码,但无法检测到任何iBeacons。以下是我的代码:未通过altbeacon检测到iBeacon android库

在Manifest中包含以下权限。除此之外,我还启用了位置服务。

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 

为活动

super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_ranging); 
beaconManager = BeaconManager.getInstanceForApplication(this); 
beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
beaconManager.bind(this); 

onBeaconServiceConnecr试图同时使用RangeNotifier和MoniterNotifier(在下面的代码注释),但都没有工作onCreate方法。 RangeNotifier始终有一个大小为零的集合,MoniterNotifier永远不会被调用。

@Override 
public void onBeaconServiceConnect() { 
    //BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); 
    beaconManager.addRangeNotifier(new RangeNotifier() { 
     @Override 
     public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) { 
      if(collection.size() > 0){ 
      for (Beacon beacon : collection) { 
        Log.i("MainActivity", "I see a beacon that is about "+beacon.getDistance()+" meters away."); 
       } 
      } 
     } 
    }); 


    /*beaconManager.addMonitorNotifier(new MonitorNotifier() { 
     @Override 
     public void didEnterRegion(Region region) { 
      Log.i(TAG, "I just saw an beacon for the first time!"); 
     } 

     @Override 
     public void didExitRegion(Region region) { 
      Log.i(TAG, "I no longer see an beacon"); 
     } 

     @Override 
     public void didDetermineStateForRegion(int state, Region region) { 
      Log.i(TAG, "I have just switched from seeing/not seeing beacons: "+state); 
     } 
    });*/ 

    try { 
     beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)); 
    } catch (RemoteException e) { } 
} 

感谢您的帮助,谢谢。

回答

1

the documentation所述,如果目标为api-23或更高版本,并且在Android 6或更高版本上运行,则需要在运行时请求位置权限。

因此,只有初始化onCreate()的BeaconManager如果用户已经授予的位置permision:

super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_ranging); 
    if (checkLocationPermission()) { 
     beaconManager = BeaconManager.getInstanceForApplication(this); 
     beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
     beaconManager.bind(this); 
    } 

如果需要,checkLocationPermission()方法将提示用户,如果用户接受位置的许可,您可以然后初始化BeaconManager:

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 

public boolean checkLocationPermission() { 
    if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_COARSE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_COARSE_LOCATION)) { 

      // Show an explanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 
      new AlertDialog.Builder(this) 
        .setTitle(R.string.title_location_permission) 
        .setMessage(R.string.text_location_permission) 
        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 
          //Prompt the user once explanation has been shown 
          ActivityCompat.requestPermissions(MainActivity.this, 
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
            MY_PERMISSIONS_REQUEST_LOCATION); 
         } 
        }) 
        .create() 
        .show(); 


     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 
     } 
     return false; 
    } else { 
     return true; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted, yay! Do the 
       // location-related task you need to do. 
       if (ContextCompat.checkSelfPermission(this, 
         Manifest.permission.ACCESS_COARSE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 

        //Set up the BeaconManager 
        beaconManager = BeaconManager.getInstanceForApplication(this); 
        beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
        beaconManager.bind(this); 
       } 

      } else { 

       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 

      } 
      return; 
     } 

    } 
}