Home » Android » android – NullPointerExecption when calling a PhoneStateListener in a service

android – NullPointerExecption when calling a PhoneStateListener in a service

Posted by: admin June 15, 2020 Leave a comment


I’ve got a PhoneStateLister where I get a bunch of data and I send to a server.

If I call the listener in a fragment, it’s all good, but when I’m calling it in a service, I get a NullPointerException.Here is my code:


public class CarrierStateListener extends PhoneStateListener {

private Context context;
private TelephonyManager telephonyManager;
private String carrierName;
private int mSignalStrength = 0;
private int mCellTowerID = 0;
private int mCellTowerAreCode = 0;
private int mcc = 0;
private int mnc = 0;

public CarrierStateListener(Context context) {
    this.context = context;

 * Get the Signal strength from the provider, each time there is an update
public void onSignalStrengthsChanged(final SignalStrength signalStrength) {

    telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    GsmCellLocation loc = (GsmCellLocation) telephonyManager.getCellLocation();
    String networkOperator = telephonyManager.getNetworkOperator();

    /** Retrieving the carrier name **/
    carrierName = telephonyManager.getNetworkOperatorName();

    /** Retrieving the RSSI value **/
    mSignalStrength = signalStrength.getGsmSignalStrength();
    mSignalStrength = (2 * mSignalStrength) - 113; // -> dBm

    /** Retrieve the cell tower id (CID) and the LAC (location area code) **/
    mCellTowerID = loc.getCid();
    mCellTowerAreCode = loc.getLac();

    /**tower mobile network code (mnc) and mobile country code (mcc) **/
    if (networkOperator != null) {
        mcc = Integer.parseInt(networkOperator.substring(0, 3));
        mnc = Integer.parseInt(networkOperator.substring(3));

    } else {
        Toast.makeText(context, "Couldn't retrieve mnc and mcc because network operator is "
                + networkOperator, Toast.LENGTH_SHORT).show();


and My Service:

public class SendDataService extends Service {

private static final String TAG = "SendDataService";
private Thread t;
private TelephonyManager telephonyManager;
private CarrierStateListener pslistener;

public IBinder onBind(Intent intent) {
    return null;

public int onStartCommand(Intent intent, int flags, int startId) {

    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "SendDataService");

    t = new Thread() {
        public void run() {
            while (true) {
                try {

                    Log.e(TAG, "sending data...");

                    //post request to send data

                } catch (InterruptedException ie) {

    Log.e(TAG, "the SendDataService started");
    return START_STICKY;

and I start the Service in onResume() of a fragment:

getActivity().startService(new Intent(getActivity(), SendDataService.class));

when the fragment starts…this is the EXCEPTION I get:

09-14 16:11:05.034  21697-21697/? E/CallDataService﹕ the SendDataService started
09-14 16:11:05.036  21697-21729/? E/CallDataService﹕ sending data...
09-14 16:11:05.037  21697-21729/? E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-2445
    Process: xxxxxxxx, PID: 21697
    java.lang.NullPointerException: Attempt to read from field 

'android.os.MessageQueue android.os.Looper.mQueue' on a null object reference
            at android.os.Handler.<init>(Handler.java:229)
            at android.os.Handler.<init>(Handler.java:137)
            at android.telephony.PhoneStateListener$1.<init>(PhoneStateListener.java:270)
            at android.telephony.PhoneStateListener.<init>(PhoneStateListener.java:270)
            at android.telephony.PhoneStateListener.<init>(PhoneStateListener.java:240)
            at xxxxxxxxxxxxx.CarierStateListener.<init>(CarierStateListener.java:27)
            at xxxxxxxxx.SendDataService.listenForEvents(SendDataService.java:96)
            at xxxxxx.util.SendDataService.access$000(SendDataService.java:25)
            at xxxxxxxxxx.util.SendDataService$1.run(SendDataService.java:53)
How to&Answers:

This is a message queue problem you have to initialize the looper before calling telephonyManager.listen and loop afterwards.

 new Thread(new Runnable() {
                    public void run() {
                        quitLooper = false;
                        tManager.listen(new PhoneStateListener() {
                            public void onSignalStrengthsChanged(SignalStrength signalStrength) {
                                lastSignalStrength = signalStrength;

                        }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);



I have the same problem. The crash happens into the construct method of MyPhoneListener class which extends PhoneStateLister. But it does nothing. So I search into the super construct method by reading the source code of PhoneStateLister


public PhoneStateListener() {
  this(SubscriptionManager.DEFAULT_SUB_ID, Looper.myLooper());
public PhoneStateListener(long subId, Looper looper) {
  if (DBG) log("ctor: subId=" + subId + " looper=" + looper);
  mSubId = subId;
  mHandler = new Handler(looper) {


public Handler(Looper looper) {
    this(looper, null, false);
public Handler(Looper looper, Callback callback, boolean async) {
    mLooper = looper;
    mQueue = looper.mQueue;
    mCallback = callback;
    mAsynchronous = async;

The crash happens in “mQueue = looper.mQueue;”. Beacause the Thread t has not a looper, so looper is null.