2017-03-22 2 views
1

Ich versuche im Grunde this zu erreichen, mit der ersten Antwort zur Verfügung gestellt. Die Frage hat Antworten im Internet und SO, aber ich habe Probleme damit, es zum Laufen zu bringen. Muss ich etwas aktivieren, zu meinem Manifest hinzufügen, ect.? Ich möchte auf ein Signal reagieren, das in Reichweite des Telefons ist. Ich arbeite in Android Studio, Targeting Android 4.3 und arbeite mit der Android Beacon Library. Basierend auf ihrer Dokumentation, alles, was ich brauche ist zu implementieren , setzen Sie eine Region, und dann jedes Mal, wenn es ein Beacon scannt, wird es automatisch didEnterRegion aufrufen. Meine Region ist Region region = new Region("all-beacons-region", null, null, null);.Reagieren auf Eddystone Beacon im Hintergrund

Ich habe auch eine sehr einfache App gebaut, die nach Beacons im Vordergrund sucht und findet. Also keine Probleme, ich bin definitiv in der Lage, meine Beacons abzuholen und grundlegende Informationen von ihnen zu ziehen.

Meine Haupttätigkeit sieht wie folgt aus:

package com.example.justin.backgroundscantest; 

    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 

    public class MainActivity extends AppCompatActivity { 

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

Und meine Klasse sieht wie folgt aus:

import android.app.Application; 
import android.content.Intent; 
import android.util.Log; 

import com.example.justin.backgroundscantest.MainActivity; 

import org.altbeacon.beacon.startup.BootstrapNotifier; 
import org.altbeacon.beacon.startup.RegionBootstrap; 

import org.altbeacon.beacon.BeaconManager; 
import org.altbeacon.beacon.BeaconParser; 
import org.altbeacon.beacon.Region; 

public class TestApp extends Application implements BootstrapNotifier { 
    private static final String TAG = ".TestApp"; 
    private RegionBootstrap regionBootstrap; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d(TAG, "App started up"); 
     BeaconManager beaconManager = BeaconManager.getInstanceForApplication(this); 
     beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("s:0-1=feaa,m:2-2=00,p:3-3:-41,i:4-13,i:14-19")); 

     // wake up the app when any beacon is seen (you can specify specific id filers in the parameters below) 
     Region region = new Region("com.example.myapp.boostrapRegion", null, null, null); 
     regionBootstrap = new RegionBootstrap(this, region); 
    } 

    @Override 
    public void didEnterRegion(Region arg0) { 
     Log.d(TAG, "Got a didEnterRegion call"); 
     // This call to disable will make it so the activity below only gets launched the first time a beacon is seen (until the next time the app is launched) 
     // if you want the Activity to launch every single time beacons come into view, remove this call. 
     regionBootstrap.disable(); 
     Intent intent = new Intent(this, MainActivity.class); 
     // IMPORTANT: in the AndroidManifest.xml definition of this activity, you must set android:launchMode="singleInstance" or you will get two instances 
     // created when a user launches the activity manually and it gets launched from here. 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     this.startActivity(intent); 
    } 
} 

(Edit) Schließlich AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.justin.backgroundscantest"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 


</manifest> 

Es Alles fühlt sich ziemlich einfach an, und ich bin neugierig, wenn ich etwas Einfaches oder Unsinnes vermisse. Ich habe dieses Beispiel an mehreren Stellen im Internet gefunden, aber keine Erwähnung von etwas, das ich übersehen habe. Ich habe einen ziemlich soliden Programmierhintergrund, bin aber neu in Android und sehr neu in der Eddystone/BLE-Technologie. Und nur um das eigentliche Problem zu klären: Es gibt keine Reaktion von meiner App, wenn ich das Telefon in Reichweite des Beacons bewege. Meine Erwartung ist, dass es "aufwachen" und MainActivity beginnen wird. Ich bin definitiv in Reichweite des Beacons, der Beacon ist definitiv eingeschaltet, und wieder kann ich ihn im Vordergrund scannen. Es wird nur nicht meine App aufwachen. Vielen Dank!

+0

Können Sie Ihre AndroidManifest.xml zeigen? – davidgyoung

+0

Bearbeitet die Frage – brocky34

+0

Wenn ich mich mehr umschaue, muss ich etwas tun, um TestApp im Stück meines Manifests zu definieren? Ich frage mich, ob das Problem ist, dass ich mir nicht ganz klar bin, wie man eine Klasse schreibt, die die Anwendung erweitert. – brocky34

Antwort

1

Beim Erstellen einer benutzerdefinierten Android Application-Klasse wie TestApp müssen Sie sie in Ihrem Manifest mit einem name-Attribut deklarieren. Wie folgt aus:

<application 
    android:name="TestApp" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

Wenn Sie das nicht tun, wird Android nicht Ihre benutzerdefinierten TestApp Klasse verwenden und stattdessen zu seinem eingebauten in Application Klasse Basisstandardmäßig, so dass keiner der TestApp Code ausgeführt werden .

+0

Yup! Wirklich nur ich habe kein gutes Verständnis davon, wie Android funktioniert. Vielen Dank! – brocky34

Verwandte Themen