2016-03-22 3 views
1

ich verwende Eddystone Leuchtfeuer und android Leuchtfeuer-Bibliothek (AltLib), ich bin ein Anfänger Benutzer mit diesen Baken; und für mein Projekt. Ich möchte die UUID des Beacons abrufen und auf einem EditView oder TextView anzeigen. Also habe ich versucht, einen Code, aber keine Möglichkeit, ich erhielt eine endlose Ausführung ... AS:die UUID von Eddystone Leuchtfeuer mit android Leuchtfeuer Bibliothek Erste

public class BeaconActivity extends ActionBarActivity implements BeaconConsumer { 

    public static final String TAG = "BeaconsEverywhere"; 
    private BeaconManager beaconManager; 

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

     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,d:25-25")); 

     beaconManager.bind(this); 

    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     beaconManager.unbind(this); 
    } 

    @Override 
    public void onBeaconServiceConnect() { 
     final Region region = new Region("myBeaons", Identifier.parse("<replaceBySomeUIID>"), null, null); 

     beaconManager.setMonitorNotifier(new MonitorNotifier() { 
      @Override 
      public void didEnterRegion(Region region) { 
       try { 
        Log.d(TAG, "didEnterRegion"); 
        beaconManager.startRangingBeaconsInRegion(region); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void didExitRegion(Region region) { 
       try { 
        Log.d(TAG, "didExitRegion"); 
        beaconManager.stopRangingBeaconsInRegion(region); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void didDetermineStateForRegion(int i, Region region) { 

      } 
     }); 

     beaconManager.setRangeNotifier(new RangeNotifier() { 
      @Override 
      public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
       for(Beacon oneBeacon : beacons) { 
        Log.d(TAG, "distance: " + oneBeacon.getDistance() + " id:" + oneBeacon.getId1() + "/" + oneBeacon.getId2() + "/" + oneBeacon.getId3()); 
       } 
      } 
     }); 

     try { 
      beaconManager.startMonitoringBeaconsInRegion(region); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_beacon, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Plötzlich verstehe ich nicht ...! Kann mir jemand bei diesem Teil helfen?

Antwort

0

Einige Punkte:

  • Eddystone-UID Baken haben keine UUID (16 Byte universell eindeutige Kennungen) als Bezeichner. Stattdessen haben sie eine 10-Byte-Namespace-ID und eine 6-Byte-Instanz-ID. Mit der Android Beacon Library gibt beacon.getId1() die 10-Byte-Namespace-ID zurück und beacon.getId2() gibt die 6-Byte-Instanz-ID zurück.

  • Um Eddystone-UID-Beacons anzupassen, müssen Sie einen Beacon-Parser für diesen Beacontyp einrichten. Wie folgt aus:

    beaconManager.getBeaconParsers().add(new BeaconParser() 
        .setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)); 
    
  • Wenn Sie alle Eddystone Baken entsprechen, unabhängig von Kennungen, so dass Sie die Kennungen aller Leuchtfeuer in der Nähe lesen können, richten Sie Ihre Region mit allen Kennungen auf wie diese null:

    final Region region = new Region("myBeacons", null, null, null); 
    
  • dann, wenn ein Eddystone-UID Leuchtfeuer durch Bereich erkannt wird, können Sie mit dem Code heraus seine Kennung in das Protokoll drucken haben Sie schon:

    public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
         for(Beacon oneBeacon : beacons) { 
          Log.d(TAG, "distance: " + oneBeacon.getDistance() + " id:" + oneBeacon.getId1() + "/" + oneBeacon.getId2() + "/" + oneBeacon.getId3()); 
         } 
        } 
    
  • Wenn Sie die erkannten Bezeichner zu einer EditView mit dem Namen myEditText hinzufügen möchten, müssen Sie sicherstellen, dass sie bereits Teil des Layouts Ihrer Aktivität ist. Wenn ja, könnten Sie so tun, wie folgt:

    final String line = "Namespace id: " + oneBeacon.getId1() + ", Instance Id:" + oneBeacon.getId2()); 
    
    runOnUiThread(new Runnable() { 
        public void run() { 
         EditText editText = (EditText)BeaconActivity.this 
           .findViewById(R.id.myEditText); 
         editText.append(line+"\n");         
        } 
    }); 
    
+0

das ein Problem ist, wenn ich die Beacons 00000000000000000000000000000001 UUID ändern ?? –

+0

Ich bin mir nicht sicher, was genau Sie meinen, indem Sie "die Beacons der UUID ändern". Vielleicht können Sie die Schritte beschreiben, die Sie unternehmen, um dies zu tun. – davidgyoung

+0

Um genauer zu sein, verwende ich ein Beacon ibks 105A, und ich habe seine UUID mit der ibks config-Tool-Anwendung manuell auf "000 .... 001" geändert. Meine Frage ist: Hat es Auswirkungen auf seine Erkennung? auch welchen Beacon Parser muss ich verwenden? Auch ich bin nicht in der Lage, die UUID noch –

Verwandte Themen