turtleboy
turtleboy

Reputation: 7574

Android PendingIntent in BroadcastReceiver's onreceive is null

I've an app where I am calling sendBroadcast(). My receiver class is as follows:

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.location.LocationManager;
import android.util.Log;

public class ProximityIntentReceiver extends BroadcastReceiver {

    private static final String TAG = ProximityIntentReceiver.class
            .getSimpleName();
    private static final int NOTIFICATION_ID = 1000;

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e(TAG, "inside prox onreceive");
        String key = LocationManager.KEY_PROXIMITY_ENTERING;
        Boolean entering = intent.getBooleanExtra(key, false);
        if (entering) {
            Log.d(getClass().getSimpleName(), "entering");
        } else {
            Log.d(getClass().getSimpleName(), "exiting");
        }
        NotificationManager notificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                null, 0);
        Notification notification = createNotification();
        notification.setLatestEventInfo(context, "Proximity Alert!",
                "You are near your point of interest.", pendingIntent);
        notificationManager.notify(NOTIFICATION_ID, notification);
    }

    private Notification createNotification() {
        Notification notification = new Notification();
        notification.icon = R.drawable.ic_launcher;
        notification.when = System.currentTimeMillis();
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notification.flags |= Notification.FLAG_SHOW_LIGHTS;
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notification.defaults |= Notification.DEFAULT_LIGHTS;
        notification.ledARGB = Color.WHITE;
        notification.ledOnMS = 1500;
        notification.ledOffMS = 1500;
        return notification;
    }
}

I have a NullPointerException on the following line.

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, null, 0);

The calling Service is as follows.

import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

public class LocationService extends Service {

    private static final String TAG = LocationService.class.getSimpleName();
    LocationManager mlocManager;
    LocationListener mlocListener;
    NfcScannerApplication nfcscannerapplication;
    private static final String PROX_ALERT_INTENT = "com.carefreegroup.ProximityAlert";
    Intent intent;
    PendingIntent proximityIntent;
    ProximityIntentReceiver pir;

    @Override
    public void onCreate() {
        nfcscannerapplication = (NfcScannerApplication) getApplication();
        mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mlocListener = new MyLocationListener();
        pir = new ProximityIntentReceiver();
        intent = new Intent(PROX_ALERT_INTENT);
        proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
        Log.e(TAG, "Service created and location manager and listener created");
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        mlocManager.removeUpdates(mlocListener);
        unregisterReceiver(pir);
        Log.e(TAG, "Service destroyed");
        super.onDestroy();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
                mlocListener);
        IntentFilter filter = new IntentFilter(PROX_ALERT_INTENT);
        registerReceiver(pir, filter);
        Log.e(TAG, "requesting location updates");
        super.onStart(intent, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;// TODO Auto-generated method stub
    }

    private class MyLocationListener implements LocationListener {

        @Override
        public void onLocationChanged(Location loc) {
            Log.e(TAG, "about to set geopoints in application object");
            nfcscannerapplication.setLat(loc.getLatitude());
            nfcscannerapplication.setLon(loc.getLongitude());
            fireLocationChangeEvent(loc.getLongitude(), loc.getLatitude());
            mlocManager.addProximityAlert(53.653480529785156,
                    -1.51961088180542, 2, -1, proximityIntent);
            sendBroadcast(intent);
        }

        @Override
        public void onProviderDisabled(String provider) {}

        @Override
        public void onProviderEnabled(String provider) {}

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {}
    }// end of MyLocationListener

    private void fireLocationChangeEvent(double lon, double lal) {
        LocalBroadcastManager.getInstance(getApplicationContext())
                .sendBroadcast(new LocationChangeIntent(lon, lal));
    }
}// end of service

.

Why am I getting a NullPointerException on this line?

Upvotes: 1

Views: 5931

Answers (1)

TNR
TNR

Reputation: 5869

As you haven't created an Intent Object and placing null in the getActivity Method, It is throwing a NullPointerException. I hope you want to call the LocationService when the Intent Action triggers BroadcastReceiver. If so, For that you need to create the Intent calling the service like below and then put the Intent object in the Pending intent.

Intent i = new Intent(context,LocationService.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, 0);

Upvotes: 2

Related Questions