Search code examples
javaandroidandroid-studioaltbeaconandroid-ibeacon

ALT beacon ranging functionality not working


I am trying to build a android application that can ranging nearby beacons, and get related information such as UUID and distance from the beacon. The problem I am facing now is that the Ranging function can not detect a single beacon at all. I am pretty sure the function is right because I have downloaded another similar demo project that can scan beacons pretty well on the same device.

The application now have no reaction at all after the beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null)) function, and the debugger shows the thread stuck in didRangeBeaconsInRegion function and the beacons size is always 0.

Is there something wrong with my code? Or is it because my setting or configuration is not correct?

Code:

package com.example.ma.contextualawarenessapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.app.Activity;
import android.os.RemoteException;
import android.widget.TextView;

import org.altbeacon.beacon.Beacon;
import org.altbeacon.beacon.BeaconConsumer;
import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.RangeNotifier;
import org.altbeacon.beacon.Region;

import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Locale;

public class GeofencingActivity extends AppCompatActivity implements     BeaconConsumer {
protected static final String TAG = "GeofencingActivity";
private BeaconManager beaconManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_geofencing);

    beaconManager = BeaconManager.getInstanceForApplication(this);
    beaconManager.bind(this);

}
@Override
protected void onDestroy() {
    super.onDestroy();
    beaconManager.unbind(this);
}
@Override
protected void onPause() {
    super.onPause();
    if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(true);
}
@Override
protected void onResume() {
    super.onResume();
    if (beaconManager.isBound(this)) beaconManager.setBackgroundMode(false);
}

@Override
public void onBeaconServiceConnect() {
    beaconManager.setRangeNotifier(new RangeNotifier() {
        @Override
        public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
            for (Beacon beacon : beacons) {
                logToDisplay(getCurrentTimeStamp() + " | Beacon " + beacon.toString() + " is about " + beacon.getDistance() + " meters away.");
            }
        /*if (beacons.size() > 0) {
            EditText editText = (EditText)GeofencingActivity.this
                    .findViewById(R.id.geofencingText);
            Beacon firstBeacon = beacons.iterator().next();
            logToDisplay("The first beacon "+firstBeacon.toString()+" is about "+firstBeacon.getDistance()+" meters away.");            }
    */}

    });

    try {
        beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
    } catch (RemoteException e) {   }
}
private void logToDisplay(final String line) {
    runOnUiThread(new Runnable() {
        public void run() {
            TextView editText = (TextView)GeofencingActivity.this
                    .findViewById(R.id.geofencingText);
            editText.append(line+"\n");
        }
    });
}

private static String getCurrentTimeStamp() {
    Locale locale = new Locale("es", "ES");
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS", locale);
    Date now = new Date();
    return sdf.format(now);
}
}

build.gradle:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"

defaultConfig {
    applicationId "com.example.ma.contextualawarenessapplication"
    minSdkVersion 18
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),     'proguard-rules.pro'
    }
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'org.altbeacon:android-beacon-library:2+@aar'
}

buildscript {
repositories {
    jcenter()
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    classpath 'com.android.tools.build:gradle:2.1.0-alpha5'

    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}
}

allprojects {
repositories {
    jcenter()
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

Solution

  • A few things to check when you cannot get detections with the Android Beacon Library:

    • Make sure your beacon is transmitting an AltBeacon format. If not, you simply need to register a BeaconParser expression to make it detect Eddystone or proprietary beacon types like iBeacon.

    • If you are unsure of the format advertised, try using the Locate app, which will tell you the format it detects.

    • If the device giving you trouble detecting has Android 6.0+, make sure you have obtained location permissions, as described here.