0

I just started with Java and Android coding. I wrote an application for a scientific study in my university. The app is for a local exhibition of a museum. I have different locations in my town, each location with its own exhibit.

Now I made an activity for each of the locations, so the user can see some useful information of the sample. Now I want to combine the app with iBeacons, I bought 6 beacons from Estimote. As I am not really experienced with this, I hope you can help with a point to start off?

I want the app to give the user a notification with some text like: "You are in front of object XY. Tap to see more information." After tapping on the notification the user should open the specific activity which I created. I also want the app to search for beacons in the background, so if the user comes close to a location, he/she gets automatically a notification after a few seconds.

I already read a post, but I could not really figure out how to use it correctly: Estimote iBeacon: Monitoring in background (Android)

Community
  • 1
  • 1
Johann
  • 19
  • 3

3 Answers3

0

A broad answer to a broad question: We did exactly that type of application for a museum here in Finland using our Proximi.io platform. You can of course hardcode the beacons, actions and content into the application by e.g. using the Estimote SDK. The benefit of using an external portal/backend is that you don't have to update the entire app whenever the museum exhibition changes. In the best scenario, the museum itself could be in charge of updating the exhibit info, when they wish. If you're interested, Proximi.io is now in open beta, and it's free and super simple to use.

Annina
  • 196
  • 4
  • Thanks for the hint. As I already mentioned I am not a professional in coding, so I did not figure out how to use the libraries and everthing appropriately. Could you please help me...? And I just need this for a scientific study, so the museum won't use this application in the future I think... – Johann Aug 27 '15 at 10:37
0

The free and open source Android Beacon Library has a reference application that launches an activity the first time a beacon is seen. You can see the line of code that launches the Activity here.

In order to modify this to do what you want, you would need to make a different Region object for each museum location, initializing it with its beacon identifiers. You'd put this in the Application onCreate method like this:

Region museumLocation1 = new Region("museumLocation1",  Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("1"));
Region museumLocation2 = new Region("museumLocation2",  Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), Identifier.parse("1"), Identifier.parse("2"));
List regionList = Arrays.asList(new Region[] {museumLocation1, museumLocation2} );
regionBootstrap = new RegionBootstrap(this, regionList);

Then you can modify the didEnterRegion method in that same class to launch different activities for each beacon like this:

if (region.getUniqueId().equals("museumLocation1")) {
    Intent intent = new Intent(this, Museum1Activity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    this.startActivity(intent);
}
if (region.getUniqueId().equals("museumLocation2")) {
    Intent intent = new Intent(this, Museum2Activity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    this.startActivity(intent);
}
davidgyoung
  • 63,876
  • 14
  • 121
  • 204
  • Thank you very much. This looks really interesting. But how can I combine this stuff with the notification? If I understood correctly, this code will launch an activity as soon as the device comes close to a beacon. I want the application to show a notification at first... Also this code seems to be a little bit too short ? – Johann Aug 19 '15 at 13:57
  • If you look in the link provided above https://github.com/AltBeacon/android-beacon-library-reference/blob/master/app/src/main/java/org/altbeacon/beaconreference/BeaconReferenceApplication.java#L71, you will see that the code actually sends either a notification or launches an activity. You could modify this to suit your needs. And yes, the code is pretty short! That is the nice thing about using the proper library to do what you want. It makes things simpler. – davidgyoung Aug 19 '15 at 15:11
  • For some reason I could not get the code to work properly. Could you please provide further help? – Johann Aug 28 '15 at 10:17
  • Please post a new question showing the code you have tried and describe what is and what is not working. – davidgyoung Aug 28 '15 at 16:53
0

so now I played a little bit with the code and this is my MainActivity for now. But I think I am not done yet. The problem is also, that the app not recognizes the region variable in the didEnterRegion - method.

package com.example.walter.him;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import android.app.Application;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import org.altbeacon.beacon.BeaconManager;
import org.altbeacon.beacon.BeaconParser;
import org.altbeacon.beacon.Identifier;
import org.altbeacon.beacon.Region;
import org.altbeacon.beacon.powersave.BackgroundPowerSaver;
import org.altbeacon.beacon.startup.RegionBootstrap;
import org.altbeacon.beacon.startup.BootstrapNotifier;

import java.util.Arrays;
import java.util.List;


public class MainActivity extends ActionBarActivity implements BootstrapNotifier
{

private static final String TAG = "AndroidProximityReferenceApplication";
private RegionBootstrap regionBootstrap;
private BackgroundPowerSaver backgroundPowerSaver;
private boolean haveDetectedBeaconsSinceBoot = false;
private andreasplatz monitoringActivity = null;
private hagentor monitoringActivity2 = null;

Typeface segoe_wp, times;
private static Button liste, info, about_us;

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

    liste = (Button) findViewById(R.id.liste);
    info = (Button) findViewById(R.id.info);
    about_us = (Button) findViewById(R.id.about_us);
    segoe_wp = Typeface.createFromAsset(getAssets(), "fonts/segoe_wp.ttf");
    times = Typeface.createFromAsset(getAssets(), "fonts/times.ttf");
    liste.setTypeface(segoe_wp);
    info.setTypeface(segoe_wp);
    about_us.setTypeface(segoe_wp);

    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setLogo(R.drawable.ic_launcher);
    getSupportActionBar().setDisplayUseLogoEnabled(true);


    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"));

    Region museumLocation1 = new Region("museumLocation1",  Identifier.parse("B9407F30-F5F8-466E-AFF9-25556B57FE6D"), Identifier.parse("56170"), Identifier.parse("42307"));
    Region museumLocation2 = new Region("museumLocation2",  Identifier.parse("B9407F30-F5F8-466E-AFF9-25556B57FE6D"), Identifier.parse("55787"), Identifier.parse("12089"));
    List regionList = Arrays.asList(new Region[]{museumLocation1, museumLocation2});
    regionBootstrap = new RegionBootstrap(this, regionList);
    backgroundPowerSaver = new BackgroundPowerSaver(this);

    onClickOpenInfo();
    onClickOpenListe();
    onClickOpenAbout();
}

public void didEnterRegion(Region arg0) {

    // Cannot resolve symbol 'region'
    if (region.getUniqueId().equals("museumLocation1")) {
            Intent intent = new Intent(this, andreasplatz.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            this.startActivity(intent);
        }

        if (region.getUniqueId().equals("museumLocation2")) {
            Intent intent = new Intent(this, hagentor.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            this.startActivity(intent);
        }
        haveDetectedBeaconsSinceBoot = true;
    }

@Override
public void didExitRegion(Region region) {

}

@Override
public void didDetermineStateForRegion(int i, Region region) {

}


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

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addNextIntent(new Intent(this, andreasplatz.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(andreasplatz activity) {
    this.monitoringActivity = activity;
}

public void onClickOpenInfo()
{
    info = (Button)findViewById(R.id.info);
    info.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent openInfo = new Intent("com.example.walter.him.info_ausstellung");
                    startActivity(openInfo);
                }
            }
    );
}

public void onClickOpenListe()
{
    liste = (Button) findViewById(R.id.liste);
    liste.setOnClickListener(
            new View.OnClickListener()
            {
                public void onClick (View v)
                {
                    Intent openListe = new Intent("com.example.walter.him.liste_orte");
                    startActivity(openListe);
                }

            }
    );
}

public void onClickOpenAbout()
{
    about_us = (Button) findViewById(R.id.about_us);
    about_us.setOnClickListener(
            new View.OnClickListener()
            {
                public void onClick (View v)
                {
                    Intent openAbout = new Intent("com.example.walter.him.about_us");
                    startActivity(openAbout);
                }

            }
    );
}


}
Johann
  • 19
  • 3
  • You really need to post this as a new question rather than asking a question as an answer. I'm happy to help, if you can post this as a question. – davidgyoung Aug 28 '15 at 20:59
  • Oh I am sorry. I am new here, so I did not know this. Should I just open a new topic? – Johann Aug 29 '15 at 07:43