Connecting Estimote Beacons with Web Service

95 Views Asked by At

I'm new to Android and i'm trying to build a android application using Estimote Beacons. i want to get dynamic notifications from web service. for that I've added network call in Android application class so that it could call continuously in background. Problem i'm facing is sometimes the network call triggers and sometimes it won't. Is it the rite thing to make network calls from Application class.? How do i go about this.? Below i have attached the Application class code.

    public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private boolean beaconNotificationsEnabled = false;
SharedPreferences sharedPreferences;
Editor editor;
private RequestQueue mRequestQueue;
String uuid_beacon;
String displayNotification;
private BeaconManager beaconManager;
private static AppController mInstance;

String authLoginValue;
String displayMinorNO;
String uuid;
String majorno;
String minorno;
String notify;
String urlforimage;

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

    sharedPreferences = getApplicationContext().getSharedPreferences("Reg", 0);
    editor = sharedPreferences.edit();
    mInstance = this;
    authLoginValue = sharedPreferences.getString("AuthTokenLogin", "");
    System.out.println("LOGIN FROM APP CONTROLLER:"+authLoginValue);

    beaconManager = new BeaconManager(getApplicationContext());
    beaconManager.setMonitoringListener(new BeaconManager.MonitoringListener() {
        @Override
        public void onEnteredRegion(Region region, List<Beacon> list) {
            System.out.println("ENETERD");

            for (Beacon beacon : list) {
                uuid = beacon.getProximityUUID().toString();
                majorno = String.valueOf(beacon.getMajor());
                minorno = String.valueOf(beacon.getMinor());
                sendUUID(uuid, authLoginValue, majorno, minorno);

            }
            displayNotification = sharedPreferences.getString("Notification", "");

            showNotification(displayNotification, "Click here to continue");
        }
        @Override
        public void onExitedRegion(Region region) {
            // could add an "exit" notification too if you want (-:
            showNotification(
                    "THANKS FOR VISITING",
                    "Come back again"
            );
        }
    });
    beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
        @Override
        public void onServiceReady() {
            beaconManager.startMonitoring(new Region("monitored region",
                    UUID.fromString("B9407F30-F5F8-466E-AFF9-25556B57FE6D"), null, null));
        }
    });

}
public static synchronized AppController getInstance() {
    return mInstance;
}
public RequestQueue getRequestQueue() {
    if (mRequestQueue == null) {
        mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    }

    return mRequestQueue;
}

public <T> void addToRequestQueue(Request<T> req, String tag) {
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
    getRequestQueue().add(req);
}

public <T> void addToRequestQueue(Request<T> req) {
    req.setTag(TAG);
    getRequestQueue().add(req);
}

public void cancelPendingRequests(Object tag) {
    if (mRequestQueue != null) {
        mRequestQueue.cancelAll(tag);
    }
}

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.drawable.logo_7edge)
            .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);
}

public void sendUUID(final String uuid, final String authTokenLoginValue,final String majorno, final String minorno) {

    // Tag used to cancel the request
    String tag_string_req = "req_register";

    StringRequest strReq = new StringRequest(Request.Method.POST,
            AppConfig.URL_UUID, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {
            Log.d(TAG, "Notification Response: " + response.toString());
            try {
                JSONObject jObj = new JSONObject(response);
                String notifyresponse = jObj.getString("notification");

                JSONObject objecttonotify = new JSONObject(notifyresponse);

                notify = objecttonotify.getString("notification");
                urlforimage = objecttonotify.getString("url");

                System.out.println("URL:"+urlforimage);


                editor.putString("Notification", notify);
                editor.putString("image_url", urlforimage);
                editor.commit();


                Log.d(TAG, "Notification1" + notify);

                String msg =jObj.get("status").toString();



                if(msg.equals("ok"))
                {
                    String SuccessMsg = jObj.getString("message");
                    //Toast.makeText(getApplicationContext(), SuccessMsg, Toast.LENGTH_LONG).show();
                }
                else if(msg.equals("error")) {
                    String errorMsg = jObj.getString("message");
                    Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_LONG).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Notification Error: " + error.getMessage());
            Toast.makeText(getApplicationContext(),
                    error.getMessage(), Toast.LENGTH_LONG).show();

        }
    }) {

        @Override
        protected Map<String, String> getParams() {
            // Posting params to register url
            Map<String, String> params = new HashMap<String, String>();
            params.put("uuid", uuid);
            params.put("authtoken", authTokenLoginValue);
            params.put("major_no", majorno);
            params.put("minor_no", minorno);

            return params;
        }

    };

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
1

There are 1 best solutions below

0
On

If your Code has successful Network call intermittently as you indicate then it seems to me the code is working given your web/server parameters. I assume thus the attempt to connect [via Volley] is sound.

You do not indicate however [judging from your code posted] that you have checked device for enabled BT, enabled Network and Internet availability. In order to judge if your code is working consistently its good practice to make sure first that the mobile device has been BT enabled, Network enabled and has access to Internet. The following snippets work for me ... including all necessary user permissions of course:

Bluetooth Enabled:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (!mBluetoothAdapter.isEnabled()) {
mBluetoothAdapter.enable();

Network and Internet:

public static NetworkInfo getNetworkInfo(Context context){
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    return cm.getActiveNetworkInfo();
}


//Check if there is any connectivity

public static boolean isConnected(Context context){
    NetworkInfo info = Utilities.getNetworkInfo(context);
    return (info != null && info.isConnected());
}


 // Check if there is any connectivity to a Wifi network

public static boolean isConnectedWifi(Context context){
    NetworkInfo info = Utilities.getNetworkInfo(context);
    return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}


// Check if there is any connectivity to a mobile network

public static boolean isConnectedMobile(Context context){
    NetworkInfo info = Utilities.getNetworkInfo(context);
    return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}

// TEST FOR INTERNET ACCESS / WEBSITE AVAILABLE

public static boolean isInternetOn() {

    String command = "ping -c1 -w3 google.com";

    // TODO progress bar while checking for internet.

    try {
        return (Runtime.getRuntime().exec(command).waitFor() == 0);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return false;
} //EO Internet ping

Hope it helps.