Android :: Telephony Manager & Phone State Listener
Sep 7, 2010
I would like to know what are the main differences between TelephonyManager and PhoneStateListener, because you can do (more or less) the same things with both. For example, you could create an incoming calls register implementing a broadcastreceiver and using TelephonyManger API or extending PhoneStateListener class and registering this new listener throughTelephonyManager . Case 1 - BroadcastReceiver (TelephonyManager)
I'm a little confused by what I'm seeing with regards to phone state transitions via the PhoneStateListener. When I receive a call, this is what happens: (call comes in) RINGING -> IDLE (I pick up) OFFHOOK (I hang up) IDLE It's that first transition from RINGING to IDLE without any interaction from me (not ending the call, not answering the call) that confuses me. Do I really have to implement an idle counter to know that an incoming call has really ended? Seems like the reported phone state represents some sort of phone state that isn't the obvious one.Is this a bug or am I just not in tune with the paradigm here?
There appears to be a leak when using PhoneStateListeners. The following code simply reigsters in onResume and unregisters in onPause a PhoneStateListener. Repeatedly launch then press BACK (so the app is finished & onDestory is called before the next launch) and the number of activities reported by meminfo will equal the number of launches. For instance, here is the output I get after launching (and finishing) 11 times in sequence:
dumpsys meminfo com.example.leak Currently running services: meminfo DUMP OF SERVICE meminfo: Applications Memory Usage (kB): Uptime: 12204322 Realtime: 12204322
Without the PhoneStateListener, the number of activities is always 1 no matter how many times the app is launched & finished. So, am I doing anything wrong here? Or is this a bug in the TelephonyManager?
I have built an application that listen to call state changes, and I want to notify a service when the call_state became IDLE.All the components I have are functional, I just need to notify (not start) a service for this.What's the correct practice, maybe using AIDL? Because, in a PhoneStateListener, I can't bind to a service. Do I have to start an activity for that?
I have a BroadcastReceiver that listens for the BOOT_COMPLETED, that part works I know because I disabled my phone listener and displayed a Toast within. That BroadcastReceiver is supposed to start a service, that also works. I run into Force Close issues when my service attempts to tell my TelephonyManager to listen. Any one have any ideas? Here is my code StartSeviceAtStartUp.java import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent;
i've registered a PhoneStateListener in BOOT_COMPLETED receiver by using following call: tm.listen(new TestCallStateListener(), PhoneStateListener. LISTEN_ CALL _STATE); If the application crashes then system automatically unregisters the PhoneStateListener. Is there any mechanism of checking if particular PhoneStateLister is registered or not? Actually i'm thinking of starting a repeating service by AlarmManager which will check if PhoneStateListener is registered or not . And if it's not registered then service will register it again. Just a backup if application crashes. Is this a good approach or there is some better mechanism to make sure that PhoneStateListener is always registered even if application crashes ?
My application process incoming/outgoing calls and shows some UI. So I use PhoneState Listener to listen changes such as CALL_STATE_IDLE , CALL_STATE_RINGING ,CALL_ STATE_ OFFHOOK. on receiving call to my BroacastReceiver for incoming/outgoing call. Most of the time things work properly. But sometimes my application does not receive events of Phone State Listener and hence it is not able to change/clear UI.From user feedback this typically occurs on HTC Hero. But I have came across this issue sometime on other devices also.My first guess is that android is killing my application in midway during call due to memory requirement. If so, is there any way to ensure that android does not my kill application under such situation .
I have low expectations that this message will get any response as it seems that Google developers do not like to address issues too close to the Android core and to strategic mobility applications. However, as they say, hope is the last to die.
I am really puzzled by the lack of response to queries about issues with some TelephonyManager functions.
Specifically, there have been a number of requests in the past, including mine, about
As per the link below, getNeighboringCellInfo() is a documented TelephonyManager function available to application developers.
Yet, getNeighboringCellInfo() does not work. Any attempt to call it in an application results in application failure.
What is the problem here? If Google does not want application developers to use this function (I cannot fathom why that would be the case), then please remove it from TelephonyManager, and save all of us time and frustration.
It's really puzzling that for such an open platform Android has so many secrets and rules.
I am currently working on porting a application written in C in android platform. I need to know that can i invoke/call the getSystemService from the C application using invocation interface by JNI. Meaning using a .java file which will interact with the interace provided by the android.telephony.TelephonyManager.java for using getCallState() and other mehthods.
Is there a way to look up the user phone number other than TelephonyManager? In my G1, this returns null: // get your phone number TelephonyManager telephonyManager = (TelephonyManager) getSystem Service (Context. TELEPHONY_SERVICE); String tel = telephonyManager.getLine1Number(); Log.i("Telephone Number ==> ", tel+" <=="); Is there any other way of getting user's own phone number? take care, Muthu Ramadoss. http://linkedin.com /in/tellibitz http://androidrocks.googlecode.com - Android Consulting. Emo Philips <http://www.brainyquote.com /quotes/authors/e/emo_philips.html> - "A computer once beat me at chess, but it was no match for me at kick boxing."
I have a compound UI component built up from a ViewGroup containing a number of TextView, ImageView etc. components. Many of these have StateListDrawables as their images/backgrounds. Is there any way of making them select from this drawable based on the state of the parent ViewGroup rather than the component itself? Ideally I want to be able to change the visual state of all children of the ViewGroup (text colour, image etc) based on the state of the ViewGroup, preferably without having to hook up complex logical code. This seems like a fairly common sort of requirement, so I was hoping it would be straightforward in Android - am I going to be disappointed?
I have researched extensively and am pretty sure this is not possible. I want to make a call and then inject DTMF when the far end answers. So 2 questions Is it possible ? If not, how do I work to get it on the list of upcoming features to be provided on Android. I can say that this is possible on BlackBerry and Symbian, so Android is falling behind in this regard.
I am using the Telephony class to get messages ( Telephony.Sms.Intents.getMessageFromIntent(Intent intent)). But I can't find the class Telephony from its package(android.provider), there is an error named "The import android.provider.Telephony cannot be resolved" when import android.provider.Telephony.Sms.Intents, the sdk version I'm using is android-sdk-windows-1.0_r2, how can I use this with the new implementation of Telephony?
There are a number of network types defined in TelephonyManager: NETWORK_TYPE_GPRS NETWORK_TYPE_EDGE NETWORK_TYPE_UMTS NETWORK_TYPE_CDMA NETWORK_TYPE_EVDO_0 NETWORK_TYPE_EVDO_A NETWORK_TYPE_1xRTT NETWORK_TYPE_HSDPA NETWORK_TYPE_HSUPA NETWORK_TYPE_HSPA Is there any info out there that describes what range of speeds you can expect on each of these? If that isn't available, it would be nice to be able to order them based on speed.
I am writing an app where I get all the data from the rest call and display all the data in a custom component list(based on Linear Layout) which is added to a LinearLayout. I write this code in onCreate of the activity. The problem is when I switch activity using startActivity, and come back to the calling activity (using startActivity) then onCreate is called again. I see onPause, onStop called when I call other activity. Is there any way that I can save the application's state?
I was just working on an application that will do stuff when a call is missed or made; and am left wondering why do you have to register a listener using a long lived background service for phone state changes instead of being able to use broadcast intents?
For applications that set the android.permission.READ_PHONE_STATE permission. What is meant by "identity" in the permission description "read phone state and identity"? Users ask about this and we don't know what to tell them...
I can see that we can get a phonestate via the PhoneStateListener, but there is no way of telling the state of the call. OFFHOOK is a number of states combined into one. Is there a particular reason for this? Are we not allowed to see the correct state of a call?
I noticed in the class TelephonyManager there are CALL_STATE_IDLE, CALL_STATE_OFFHOOK adn CALL_STATE_RINGING. They seem to be used for incoming calls.What I actually want to do is to be notified when an outgoing call is made, is received, or timed out. How to do that?
I'm writing an android application that maintains a lot of "state" data...some of it I can save in the form of onSaveInstanceState but some of it is just to complex to save in memory.
My problem is that sliding the phone open destroys/recreates the app, and I lose all my application state in the process. The same thing happens with the "back" button, but I overloaded that function on my way. Is there any way to overload the phone opening to prevent it from happening?
TelephonyManager.getNetworkType() returns one of the constant values.It appears that the constant values have an integer order, by possible bearer link speed.I know using constant values used in the following manner is generally bad,however could one use this to determine a basic cutoff for application functionality and have it work between API levels? (in API-v1 there was nothing above 0x03)if( telephonyManager.getNetworkType() > TelephonyManager.NETWORK_TYPE_EDGE ) return "3G! party on!";else if( telephonyManager.getNetworkType() > TelephonyManager.NETWORK_TYPE_UNKNOWN )}
I was trying to root my samsng behold 2 earlier today using the command codes on theunlockr.com. I thought everything was going well as I went all the way to the last step where it rebooted my behold 2. Problem is, the phone kinda just turned off after doing the reboot command and didn't turn back on by itself (I gave it like 10 minutes). I eventually then just turned on the phone manually and noticed that everything was super laggy. Even when I used taskkiller to kill every task minus GDE, it said I only had 38MB ram available. I rebooted my phone a few times and it was laggy everytime so I decided to do a hard reset. The problem is that when I attempted the hard-reset, it will now get stuck on the samsung screen when trying to load up (stayed there for over 30 minutes). I can still enter the phone if I just start it up regularly without trying to hard-reset, but it will continue to be VERY laggy.
Is there anything I can do to restore this phone back to its original state? I was reading about using ODIN to flash it or something, but for some reason my computer doesn't detect my phone when I go into Download mode on startup (it does however detect the usb drivers on my phone once the phone officially startsup into its homepage).
I am trying to save some values in the onSaveInstanceState(Bundle) method of my activty by following the example here: How do I save an Android application's state?
But it doesnt seem to load it from the Oncreate(). the bundle object is always null but whenever i call another activity, it does indeed go into the onSaveInstanceState method to save my values.
Now i read that question i just posted and someone noted how they could not get it to work in an emulator? unfortunately that is all im working on. On an emulator and cant test the app on the device as i have no device available to me right now And the web services i am interacting with are in a local VM on my work machine that cannot be accesses remotely at the moment.
My question is, is it true that saved bundles dont work on emulators? I also noticed how when i do dismiss or bring up a new activity , the activity calles onPause and then onStop. when i bring back the same activty, it goes straight to onCreate?
now according to the docs here http://developer.android.com/guide/topics/fundamentals.html#actlife That is correct in terms of what the lifecycle diagram shows but if you read below that diagram on the onStop() section it says the next step it goes into is either onRestart() or onDestroy()? no mention of onCreate? Type on the docs?
Anyways here is my onSaveInstanceState() and onCreate() both in the same activity: code...
I have a simple app with a surfaceview nothing special one would say. However when installing on my phone I get two warnings. 1 - Phone calls - read phone state and identity 2 - Storage - modify/delete SD card content. My really is nothing more than a simple puzzle and I dont understand why I get these warnings.