简体   繁体   中英

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?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM