2015-09-18 3 views
1

Я работаю над маяком, используя Altbeacon library. Я пытаюсь обнаружить маяк в фоновом режиме, как упомянуто here. Активность моих приложений контролирует маяк и возвращает значения правильно. Но когда я убиваю приложение, приложение не обнаруживает маяк. Ниже приведен мой класс приложения.Android не обнаруживает маяк с фона

public class BeaconApplication extends Application implements BootstrapNotifier{ 

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

@Override 
public void onCreate() { 
    super.onCreate(); 
    BeaconManager beaconManager = org.altbeacon.beacon.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.setBackgroundScanPeriod(5000l); // 5 secs 
    beaconManager.setForegroundScanPeriod(5000l); // 5 secs 
    Log.d(TAG, "setting up background monitoring for beacons and power saving"); 
    Region region = new Region("backgroundRegion", 
      Identifier.parse("fda50693-a4e2-4fb1-afcf-c6eb07647825"), Identifier.parse("10004"), Identifier.parse("54480")); 
    regionBootstrap = new RegionBootstrap(this, region); 

} 

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

     haveDetectedBeaconsSinceBoot = true; 
    } else { 
     if (mainActivity != null) { 
      mainActivity.logToDisplay("I see a beacon again"); 
     } else { 
      Log.d(TAG, "Sending notification."); 
      sendNotification(); 
     } 


} 

} 



@Override 
public void didExitRegion(Region region) { 
    if (mainActivity != null) { 
     mainActivity.logToDisplay("I no longer see a beacon."); 
    } 
} 

@Override 
public void didDetermineStateForRegion(int i, Region region) { 
    if (mainActivity != null) { 
     mainActivity.logToDisplay("I have just switched from seeing/not seeing beacons: " + i); 
    } 
} 

private void sendNotification() { 
    NotificationCompat.Builder builder = 
      new NotificationCompat.Builder(this) 
        .setContentTitle("Welcome to beacon zone") 
        .setContentText("You are in a beacon zone.") 
        .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); 
    Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    builder.setSound(alarmSound); 
    builder.setAutoCancel(true); 
    Notification notification = builder.build(); 
    notification.flags = Notification.DEFAULT_LIGHTS; 
    notification.flags = Notification.FLAG_AUTO_CANCEL; 
    notification.flags = Notification.FLAG_ONLY_ALERT_ONCE; 
    NotificationManager notificationManager = 
      (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(1, notification); 
} 

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

И вот мой файл манифеста

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

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

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

</application> 
+0

Я не знаю, почему этот вопрос получил минус. Что не так с этим вопросом? –

+0

Когда вы говорите «убить», вы имеете в виду проведите его по экрану из недавнего списка задач или от остановки приложения из настроек приложения? Какая модель устройства и версия ОС это? – davidgyoung

+0

Эй, @davidgyoung, я имею в виду вытащить его из экрана из недавнего списка задач. Я использую Samsung Galaxy Note II - GT-N7100. –

ответ

0

Некоторые пользователи сообщили, что некоторые устройства Samsung запрещают функциональность одного приложения вы убить приложение от переключателя задач до тех пор, пока не будет вручную возобновлен. Стандартное поведение Android заключается в том, что уничтожение приложения из переключателя задач позволяет автоматическое повторное включение, но убийство приложения с остановкой в ​​настройках не позволяет автоматическое повторное включение. Кажется, что в некоторых сборках Samsung отключение с помощью переключателя задач делает нестандартную остановку, а не обычную остановку, как предписано Android.

Об этом в Android Beacon Library есть tracking issue. In содержит ссылку на special test app, которую вы можете создавать и использовать для описания того, как эта функция работает на вашем устройстве. Следуя инструкциям в этом выпуске и сообщая результаты, было бы очень полезно выяснить, что происходит. К лучшему или худшему, фрагментарный характер Android означает, что каждое устройство ведет себя несколько иначе и должно быть охарактеризовано отдельно.

В дополнение к выполнению вышеуказанного, было бы полезно узнать версию операционной системы и номер сборки на конкретном устройстве, у которого есть эта проблема.

Смежные вопросы