Search code examples
javaandroidibeacon-android

Pass an iBeacon Major ID from Java Class to activity in Android Studio


I'm trying to get the Major ID from an iBeacon as a string and pass it to an activity called "LoginActivity.java" so that I can then pass it to my PHP script via Volley POST along with login info username and password, the script will first check if the beacon value is NULL, if so return an error that a beacon is not in range so they cannot log in.

So far I've gotten the Major ID and converted it to a string but I'm getting an error when creating the intent "Cannot resolve constructor". I marked the line where I'm getting the error with <<<<ERROR below. (It's near the end).

package com.mcrlogs.pp.test;

/**
 * Created by myuser on 15/01/2017.
 */

import android.app.Application;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothClass;
import android.content.Context;
import android.content.Intent;

import com.estimote.sdk.Beacon;
import com.estimote.sdk.BeaconManager;
import com.estimote.sdk.Region;

import java.util.List;
import java.util.UUID;


public class BeaconChecker extends Application {

    private BeaconManager beaconManager;

    public void showNotification(String title, String message) {
        Intent notifyIntent = new Intent(this, MainActivity.class);
        notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivities(this, 0,
                new Intent[] { notifyIntent }, PendingIntent.FLAG_UPDATE_CURRENT);
        Notification notification = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.security)
                .setContentTitle(title)
                .setContentText(message)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .build();
        notification.defaults |= Notification.DEFAULT_SOUND;
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(1, notification);
    }

    @Override
    public void onCreate() {
        super.onCreate();

        beaconManager = new BeaconManager(getApplicationContext());

        beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
            @Override
            public void onServiceReady() {
                beaconManager.startMonitoring(new Region(
                        "monitored region",
                        UUID.fromString("B9407F30-F5F8-466E-AFF9-25556B57FE6D"),
                        null, null));
            }
        });

        beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
            @Override
            public void onEnteredRegion(Region region, List<Beacon> list) {
                String iBeaconID = convertIBeaconIDToString(list.get(0).getMajor());
                System.out.println(iBeaconID);
                showNotification(
                        "MCR Beacon Detected!",
                        "Login enabled.");
            }

            private String convertIBeaconIDToString (int major) {
                String iBeaconID = "";
                iBeaconID = iBeaconID.concat(Integer.toString(major));
                return iBeaconID;
                Intent i = new Intent(this, LoginActivity.class); <<<<ERROR
                i.putExtra("iBeaconID",iBeaconID);
            }

            @Override
            public void onExitedRegion(Region region) {
                // could add an "exit" notification too if you want (-:
            }
        });

    }

}

Solution

  • Try changing:

    Intent i = new Intent(this, LoginActivity.class);
    

    To:

    Intent i = new Intent(BeaconChecker.this, LoginActivity.class);
    

    This clarifies that the this you refer to is the Application class that satisfies the requirements of the constructor for Intent.