我刚开始使用Java和Android编码。我在我的大学写了一份科学研究申请书。该应用程序是为博物馆的本地展览。我镇上有不同的地点,每个地点都有自己的展览。
现在我为每个位置制作了一个活动,因此用户可以看到该示例的一些有用信息。现在我想将应用程序与iBeacons结合使用,我从Estimote购买了6个信标。我希望应用程序向用户发送一些通知,其中包含以下文字:“您在对象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);
}
}
答案 0 :(得分:0)
我建议您从头开始学习如何将BeaconManager放入Application类,而不是将Activity中的代码复制粘贴到应用程序中,因为这两种方法之间存在一些差异。 / p>
最好的地方是从教程开始,收集一些基本概念和一般理解:
http://developer.estimote.com/android/tutorial/part-1-setting-up/
此外,您还可以通过Estimote Cloud生成通知示例:
https://cloud.estimote.com/#/apps/add/notification
一旦你学会了如何将BeaconManager集成到Application类中,修改onEntered / Exited回调以根据你输入范围的信标产生不同的活动应该非常简单。
这是我建议遵循的顺序。
完全披露:我在Estimote担任开发人员代言人。