iBeacon Мониторинг с классом приложения
Я только начал с Java и Android кодирования. Я написал заявку на научное исследование в моем университете. Приложение для местной выставки музея. У меня есть разные локации в моем городе, каждая из которых имеет свою выставку.
Теперь я выполнил задание для каждого местоположения, чтобы пользователь мог увидеть некоторую полезную информацию об образце. Теперь я хочу совместить приложение с iBeacons, я купил 6 маяков у Estimote. Я хочу, чтобы приложение отправляло пользователю уведомление с текстом: "Вы находитесь перед объектом XY. Нажмите, чтобы увидеть больше информации". После нажатия на уведомление пользователь должен открыть конкретное действие, которое я создал. Я также хочу, чтобы приложение осуществляло поиск маяков в фоновом режиме, поэтому, если пользователь приблизится к местоположению, он / она автоматически получит уведомление через несколько секунд.
Теперь я хочу, чтобы приложение работало в фоновом режиме. На данный момент пользователь получает уведомления только тогда, когда приложение находится на переднем плане. Я взял пример Estimote и немного изменил его.
Я уже читал в другой ветке, что я должен держать BeaconManager в классе приложения. Но как мне именно это сделать. Когда я пытаюсь скопировать код, связанный с маяком, в новый класс, с которого я начинаю
public void BeaconMain extends Application{
но потом я получаю много ошибок и не могу их исправить. Не могли бы вы помочь мне с этим, пожалуйста? Вот мой код до сих пор:
public class MainActivity extends ActionBarActivity
{
private static final int NOTIFICATION_ID = 123;
private BeaconManager beaconManager;
private NotificationManager notificationManager;
private Region mariendom;
private Region andreasplatz;
private boolean entered = false;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Beacon beacon = getIntent().getParcelableExtra("extrasBeacon");
andreasplatz = new Region("andreasplatz", "B9407F30-F5F8-466E-AFF9-25556B57FE6D", 31134, 3);
mariendom = new Region("mariendom", "B9407F30-F5F8-466E-AFF9-25556B57FE6D", 31134, 2);
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
beaconManager = new BeaconManager(this);
beaconManager.setBackgroundScanPeriod(500, 1000);
beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener()
{
@Override
public void onEnteredRegion(Region region, List<Beacon> beacons)
{
if(region.getMinor().equals(2)){
postNotification("Sie sind am Mariendom");
Log.d("Estiomote", "Entered region");
}
else if(region.getMinor().equals(3)){
postNotification2("Sie sind am Andreasplatz");
Log.d("Estiomote", "Entered region");
}
}
@Override
public void onExitedRegion(Region region)
{
/*entered = false;
postNotification("Sie haben den Mariendom verlassen");
Log.d("Estiomote", "Exited region");*/
}
@Override
protected void onResume()
{
super.onResume();
notificationManager.cancel(NOTIFICATION_ID);
beaconManager.connect(new BeaconManager.ServiceReadyCallback()
{
@Override
public void onServiceReady()
{
try {
Log.d("Estiomote", "Start monitoring");
beaconManager.startMonitoring(andreasplatz);
beaconManager.startMonitoring(mariendom);
} catch (RemoteException e)
{
Log.d("Estiomote", "Error while starting monitoring");
}
}
});
}
@Override
protected void onDestroy()
{
notificationManager.cancel(NOTIFICATION_ID);
beaconManager.disconnect();
super.onDestroy();
}
private void postNotification(String msg)
{
Intent notifyIntent = new Intent("com.example.walter.him.mariendom");
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivities(
MainActivity.this,
0,
new Intent[]{notifyIntent},
PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(MainActivity.this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("HiM - Hildesheim im Mittelalter")
.setContentText(msg)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.build();
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
notificationManager.notify(NOTIFICATION_ID, notification);
}
private void postNotification2(String msg)
{
//Intent notifyIntent = new Intent(MainActivity.this, MainActivity.class);
Intent notifyIntent = new Intent("com.example.walter.him.andreasplatz");
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivities(
MainActivity.this,
0,
new Intent[]{notifyIntent},
PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(MainActivity.this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("HiM - Hildesheim im Mittelalter")
.setContentText(msg)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.build();
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_LIGHTS;
notification.defaults |= Notification.DEFAULT_VIBRATE;
notificationManager.notify(NOTIFICATION_ID, notification);
}
}
1 ответ
Я бы посоветовал вам начать с нуля с изучения того, как поместить BeaconManager в класс Application, а не копировать код, который был в Activity в Application, поскольку между этими двумя подходами есть некоторые различия.
Лучше всего начать с учебника, чтобы собрать некоторые фундаментальные понятия и общее понимание:
http://developer.estimote.com/android/tutorial/part-1-setting-up/
И есть также пример уведомления, который вы можете создать через Estimote Cloud:
Когда вы узнаете, как интегрировать BeaconManager в класс Application, будет довольно просто изменить обратные вызовы onEntered/Exited, чтобы вызывать различные действия в зависимости от того, какой маяк вы указали в диапазоне.
Это порядок, который я бы предложил следовать.
Полное раскрытие: я работаю адвокатом разработчика в Estimote.