2016-02-25 58 views
0

我的目的是當應用程序關閉時,應用程序必須向用戶發送通知。我爲此使用了Altbeacon背景庫。Altbeacon Library - didEnterRegion功能在後臺和Foregorund掃描時不觸發

參考:https://github.com/AltBeacon/android-beacon-library-reference/blob/master/app/src/main/java/org/altbeacon/beaconreference/BeaconReferenceApplication.java

雖然應用程序發送的信標檢測到的日誌,didEnterRegion功能不受BootstrapNotifier觸發。我無法理解這種情況。

我的日誌:

02-25 21:15:39.906 3183-3203/com.beacon.beacondetection.beacondetection D/BluetoothAdapter: onScanResult() - Device=E1:B9:E3:76:91:50 RSSI=-50 

02-25 21:15:39.916 3183-3204/com.beacon.beacondetection.beacondetection D/BluetoothAdapter: onScanResult() - Device=CC:E0:4C:60:F8:C8 RSSI=-87 

AndroidManifest.xml中

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

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


    <activity 
     android:launchMode="singleInstance" 
     android:name=".MainActivity" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme.NoActionBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

BeaconDetection:

類BeaconDetection擴展應用實現BootstrapNotifier {

private static final String TAG = "BeaconDetection"; 
private RegionBootstrap regionBootstrap; 
private BackgroundPowerSaver backgroundPowerSaver; 
private boolean haveDetectedBeaconsSinceBoot = false; 
private MainActivity monitoringActivity = null; 

public void onCreate() { 
    super.onCreate(); 
    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this); 

    beaconManager.getBeaconParsers().clear(); 
    beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25")); 

    beaconManager.setBackgroundScanPeriod(1000l); 
    beaconManager.setBackgroundBetweenScanPeriod(3000l); 

    Region region = new Region("backgroundRegion", null, null, null); 
    regionBootstrap = new RegionBootstrap(this, region); 

    backgroundPowerSaver = new BackgroundPowerSaver(this); 
} 


@Override 
public void didEnterRegion(Region arg0) { 
    Log.d(TAG, "did enter region."); 
    if (!haveDetectedBeaconsSinceBoot) { 
     Log.d(TAG, "auto launching MainActivity"); 

     Intent intent = new Intent(this, MainActivity.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     this.startActivity(intent); 
     haveDetectedBeaconsSinceBoot = true; 
    } else { 
     if (monitoringActivity != null) { 
     } else { 

      Log.d(TAG, "Sending notification."); 
      sendNotification(); 
     } 
    } 
} 

@Override 
public void didExitRegion(Region region) { 
    if (monitoringActivity != null) { 
    } 
} 

@Override 
public void didDetermineStateForRegion(int state, Region region) { 
    if (monitoringActivity != null) { 
    } 
} 

private void sendNotification() { 
    NotificationCompat.Builder builder = 
      (NotificationCompat.Builder) new NotificationCompat.Builder(this) 
        .setContentTitle("Beacon Reference Application") 
        .setContentText("An beacon is nearby.") 
        .setSmallIcon(R.mipmap.ic_launcher); 

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
    stackBuilder.addNextIntent(new Intent(this, MainActivity.class)); 
    PendingIntent resultPendingIntent = 
      stackBuilder.getPendingIntent(
        0, 
        PendingIntent.FLAG_UPDATE_CURRENT 
      ); 
    builder.setContentIntent(resultPendingIntent); 
    NotificationManager notificationManager = 
      (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(1, builder.build()); 
} 

public void setMonitoringActivity(MainActivity activity) { 
    this.monitoringActivity = activity; 
} 

}

回答

0

一種可能性是您的信標沒有傳輸AltBeacon數據包,這是所示代碼的唯一信標格式,用於檢測。

如果你的信標發射機正在發送埃迪斯通-UID或iBeacon顯示格式的數據包,就必須添加一個新的符合:

beaconManager.getBeaconParsers().add(new BeaconParser(). 
     setBeaconLayout("...") 

在哪裏......是你的燈塔類型的正確佈局表達。您可以通過Google搜索輕鬆找到適合您的信標類型的佈局字符串。

+0

在我上面編寫的參考應用程序中,當我使用RangingActivity.java類時,應用程序在** onBeaconServiceConnect()**函數上檢測到信標。這裏沒有任何問題。但是,當應用程序正在運行時,如果我觸摸主頁按鈕並且應用程序轉到背景,正如您所知。和應用程序去RanginActivity.java中的**暫停**方法。我猜測信標掃描必須在** BeaconDetection **類中繼續。當檢測到任何信標時,必須檢測到** didEnterRegion()**函數。但是在** RangingActivity.java **類中** onBeaconServiceConnect()**函數被再次觸發。我該如何解決? –

+0

對不起,恐怕我不明白這個問題。你說didEnterRegion()永遠不會被調用,是嗎?如果屬實,這是要解決的真正問題。每次啓動測距活動時都會調用onBeaconServiceConnect,這是正常的。這不是問題。 – davidgyoung

+0

在參考應用程序中,Application類使用RegionBootstrap連接到信標服務。然後如果並且當它找到一個信標時,就會調用didEnterRegion。我會在這個方法上設置一個斷點或者添加一個調試行,並且驗證它在beacon被打開時被調用。如果不是,請使用現有的定位信標Android應用程序進行驗證,以檢測信標並驗證它是否是iBeacon或其他類型。 – davidgyoung