I am writing an application that runs in the background as a foreground service. This service creates an instance of the PhoneStateListener subclass. PhoneStateListener creates a TelephonyService with a foreground service context object, and then listens for cell location changes. This works great while the display is on. But as soon as the display goes blank, cell registration no longer works.
public class gps_service extends Service { public static TelephonyManager p_TelephonyManager = null; public static myPhoneStateListener p_myPhoneStateListener = null; @Override public int onStartCommand(Intent intent, int flags, int startId) { p_myPhoneStateListener = new myPhoneStateListener(); p_TelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); p_TelephonyManager.listen(p_myPhoneStateListener, PhoneStateListener.LISTEN_CELL_LOCATION); ...
}
public class myPhoneStateListener extends PhoneStateListener { public static int CurrentCellID;
}
<uses-sdk android:minSdkVersion="3" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
When the phone screen is on, everything works fine, but when the onCellLocationChanged event enable screen never rings. I also try GsmCellLocation currentCellLocation = (GsmCellLocation) p_TelephonyManager.getCellLocation (); this code always returns the last cell identifier before the screen is turned off, and not the actual cell identifier.
I also try partial_wake_lock in my service, but the same results:
private PowerManager pPowerManager = null; private PowerManager.WakeLock pWakeLock = null; .. @Override public void onCreate() { super.onCreate(); pPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); pWakeLock = pPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "No sleep"); pWakeLock.acquire(); ... } @Override public void onDestroy() { if (pWakeLock != null) { pWakeLock.release(); pWakeLock = null; } ... }
Any idea what I'm doing wrong? Testing on HTC Desire Z Android 2.2
source share