2017-10-04 72 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; 
     } 

    } 
}