代码之家  ›  专栏  ›  技术社区  ›  Abhishek Dhotre

altbeacon android库未检测到iBeacons

  •  2
  • Abhishek Dhotre  · 技术社区  · 8 年前

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

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

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

    活动的onCreate方法

    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);
    

    OnBeaConserviceConnerc尝试同时使用RangeNotifier和MonitorNotifier(在下面的代码中进行了注释),但两者都不起作用。RangeNotifier始终具有大小为零的集合,并且从不调用MonitorNotifier。

    @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 回复  |  直到 8 年前
        1
  •  1
  •   Daniel Nugent    8 年前

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

    因此,仅在中初始化BeaconManager onCreate() 如果用户已授予位置许可:

        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;
            }
    
        }
    }