2016-04-03 16 views
0

Ich versuche, eine Android-Anwendung zu bauen, die in der Nähe von Beacons reichen kann, und verwandte Informationen wie UUID und Entfernung vom Beacon erhalten. Das Problem, mit dem ich jetzt konfrontiert bin, ist, dass die Ranging-Funktion kein einzelnes Beacon erkennen kann. Ich bin ziemlich sicher, dass die Funktion richtig ist, weil ich ein anderes ähnliches Demo-Projekt heruntergeladen habe, das Beacons ziemlich gut auf demselben Gerät scannen kann.ALT Beacon Ranging-Funktionalität funktioniert nicht

Die Anwendung hat jetzt keine Reaktion nach der BeaconManager.startRangingBeaconsInRegion (neue Region ("myRangingUniqueId", null, null, null)) -Funktion, und der Debugger zeigt den Thread in DidRangeBeaconsInRegion-Funktion stecken und die Beacons-Größe ist immer 0.

Gibt es etwas falsch mit meinem Code? Oder liegt es daran, dass meine Einstellung oder Konfiguration nicht korrekt ist?

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:[email protected]' 
} 

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 
} 

Antwort

0

ein paar Dinge zu überprüfen, wenn Sie nicht Erfassungen mit dem Android Beacon Library bekommen:

  • Stellen Sie sicher, Ihr Leuchtfeuer ist Übertragen eines AltBeacon-Formats. Wenn nicht, müssen Sie einfach einen Ausdruck BeaconParser registrieren, um Eddystone oder proprietäre Beacon-Typen wie iBeacon zu erkennen.

  • Wenn Sie sich des angegebenen Formats nicht sicher sind, versuchen Sie es mit der Locate app, die Ihnen das erkannte Format anzeigt.

  • Wenn das Gerät, das Probleme erkennt, über Android 6.0+ verfügt, stellen Sie sicher, dass Sie die Standortberechtigungen erhalten haben, wie unter here beschrieben.

+0

Es funktionierte schließlich, nachdem ich das Ziel sdk zu 21 änderte und die Positionserlaubnis hinzufügte. Du hast mein Wochenende gerettet, vielen Dank! –