I was a bit surprised when three people asked me how to do this in one day. I figured if there was enough interest in it then maybe it deserved a post of it's own. Basically you want to know the primary phone number of the device your app is running on. In order to do that in PhoneGap you will need to write a plugin to access the TelephonyManager service on Android.
As always the code for this plugin is is GitHub at my TelephoneNumberPlugin repo. If you'd rather have a more detailed walk through please read on.
First up let's code our JavaScript interface which we will use to get the telephone number. We'll setup a new interface at "cordova/plugin/telephonenumber" to avoid name collisions. Then the rest is fairly boiler plate code where we declare and error object that we won't even use and finally provide a get method. When you call the get method you should provide a success callback. The success callback will be invoked with a string that will contain the devices phone number. If something goes wrong the failure callback will be invoked.
I've extracted the execute method from TelephoneNumber.java which extends from the new CordovaPlugin interface. The method is fairly self explanatory. If the device has a phone number it will be returned. If not the error call back is invoked with the NO_TELEPHONE_NUMBER error code. If you try to call anything other than "get" on this class you'll get a INVALID_ACTION error.
In order to use this plugin you'll need to include the telephonenumber.js in your HTML as a script tag:
and add a line to res/xml/config.xml to tell the JavaScript side where to find your Java class:
and if you don't already have READ_PHONE_STATE as a permission in your AndroidManifest.xml you will need to add it as well.
Now you should be able to get your devices phone number. Here is some sample code that writes the phone number out to the console:
Hi Simon,
ReplyDeletegreat post, thanks!
BTW, can such a plugin be written in iOS/WP7+/BB?
@BorG
ReplyDeleteYes, of course. Reuse the JS but each OS will need its own native implementation.
Any particular reason why you would limit this to just the telephone number and not make a more generic plugin? Looking at the API (http://developer.android.com/reference/android/telephony/TelephonyManager.html), there appears to be other things in there that might be of use as well. (Although certainly none as much as the main telephone #.)
ReplyDelete@Raymond Camden
ReplyDeleteNo reason other than that was the question that I was trying to answer for the three or so folks who contacted me. It would be pretty easy to add more capabilities to the plugin and since it is up on Github I welcome pull requests from anyone that has done so.
Hey Simon, I have tried your code but no luck, Its working on Android 4.0.4. Not working on below version's plz help me form this issue.
ReplyDelete@Vasu Nanguluri
ReplyDeleteDefine, no luck.
Hi Simon,
ReplyDeleteIt was very great to have the article, but i have trying to send the sms in background, but i was not much sucessfull, could you help me in this issue.
could you send me any sample if you have, i have tried the sample in the github i was getting the exception "Uncaught TypeError : Cannot read property 'sms' of undefined".
@jagadesh
ReplyDeleteWhat code on github are you using? It sounds like the plugin you are using is not updated for Cordova 2.0.0 or greater.
HI simon,
ReplyDeletei need to know is there any database in android storing the total sms count .
if i use content://sms/ it is returning only the available sms count in the mobile but i want overall sms count sent form the mobile from the begining ..
thanks in advance
Sangeeth
Dear Simon,
ReplyDeleteCould you help me in integrating the Facebook, linked in phonegap, I have tried a lot but had no luck.
Thanks in advance
@sangeeth_LVS
ReplyDeleteTo the best of my knowledge content://sms will only give you the total number of SMS currently on the device. If you want to get an idea of every SMS ever received by the device you'll need to create an app that keeps track of it.
@jagadesh
ReplyDeleteI hate Facebook with a passion that I usually reserve for opponent hockey teams (think of that cricket team you love to hate). So sorry, no I've never tried to integrate with Facebook.
This is super, thank you.
ReplyDeleteOne question (I'm still new w/phonegap), I'm running cordova-2.3.0, when I add this plugin, I get the error:
02-12 11:14:37.786: E/Web Console(380): module cordova/plugins/telephonenumber not found at undefined:0
in my log. However, the plugin seems to be working? I must have missed something, but I'm at a loss as to what.
@Geoffrey Giordano
ReplyDeleteThat was a mis-spelling on my part. I've fixed it on github. Go grab the lastest JS file for the fix.
Hi Simon,
ReplyDeleteThanks for this, but having some difficulty getting this working. I've followed the instructions exactly (or so I believe!) and I'm getting this error:
E/Web Console(12504): Uncaught module cordova/plugin/telephonenumber not found at file:///android_asset/www/cordova-2.3.0.js:48
Any suggestions?
Thanks
Oops, solved it. Like an idiot I put telephonenumber.js in the wrong place. :) Thanks a lot for this plugin!
ReplyDeleteHi Simon,
ReplyDeleteI read your blog. It was very great to have the article. i am new to phonegap and using cordova2.4.0 version. i have one query related to cordova.define(path). what is path here means you are asking (cordova/plugin/ipaddress)
@Navjot Singh
ReplyDeleteI saw your email on this question. You did not include the script tag for telephonenumber.js.
@simon MacDonald many many thanks to you
ReplyDeleteHi simon
ReplyDeletei have using cordova2.4.0 and when i run a demo project for testing plugin is working or not getting an error "Falling back on PROMPT mode since _cordovaNative is missing."
when app is run after that i click on app than i got error "Invalid action"
i am using this code with my new cordova 2.4.0 version.
download.macromedia.com/pub/developer/phonegap/myfirstphonegapplugin_a.zip
can you please help me.
Thanks & regards
Navjot singh
Skype : navjotsinghmca
@Navjot Singh
ReplyDeleteWell when I import that code into Eclipse it runs just fine. However it is using Cordova 1.6.1. If you are running against 2.4.0 with the same code you will run into an issue where some of the API's are deprecated but it should still run. The JS will need to change a bit.
Try...
var exec = cordova.require("cordova/exec");
var HelloPlugin = {
callNativeFunction: function (success, fail, resultType) {
return exec(success, fail, "com.tricedesigns.HelloPlugin", "nativeAction", [resultType]);
}
};
@Simon
ReplyDeleteCould you explain what you meant earlier when you said
"Yes, of course. Reuse the JS but each OS will need its own native implementation." ?
I don't understand how to apply this to iOS.
@xakim
ReplyDeleteTake the same JS file then write the native plugin for iOS.
http://docs.phonegap.com/en/2.5.0/guide_plugin-development_ios_index.md.html#Developing%20a%20Plugin%20on%20iOS
Hi Simon,
ReplyDeleteI followed all the instruction above and developed app which gets quite a few phone/sim information.
It works on Samsung Galaxy Nexus and does not work on any HTC phone. I googled and found some issue related to hydration. Can you please let me know how I can fix it for HTC ?
I am using Eclipse to build and deploy app on my local box, I have not uploaded my app anywhere.
Any help really appeciated.
Cheers,
Prashanth
@Prashanth Rao
ReplyDeleteSorry some vendors don't publish the phone number to the SIM card. You'll have to ask the user for it.
@Simon
ReplyDeleteThanks for the info. I will try and see how i can get around few tricky bits.
Cheers,
Prashanth
Hi Simon
ReplyDeleteGreat work, thanks much for the plugin.
I am using cordova 2.7 and trying to console log the phone number, I have tried many sim cards but it returns blank.
Is there a different way to write the JS file for this version of cordova? or will the existing JS work?
Thanks much
Mohan
@Mohan Kuldeep Ponnada
ReplyDeleteSorry not every vendor puts the number on the SIM card.
Can this be used on an iPhone? Please say yes? If it can't, how can it then be used on an iPhone?
ReplyDelete@DesignerOfArt
ReplyDeleteNo, I only wrote the Android version of this plugin. It is possible in iOS though, someone just has to write it.
Hi Simon,
ReplyDeleteIn my application i have to get both the mobile numbers from dual sim phone? Here in your application we can able to get only one mobile number.
Is there any way to get both the numbers? Please help it is very important for me?
@sree kanth
ReplyDeleteThere is no Android API to support dual sim's. Most phones that have this capability are extended by the manufacturers and they are not making the API available.
Check out this app:
http://www.qianqin.de/multisim/
You may want to contact the developer to see if he can help you.
Hello Simon,
ReplyDeleteThanks for your post ! I have remarked that the code you propose doesn't compile on Cordova 3.0. By looking at some modifications made to the PushPlugin phonegap plugin, I just changed the TelephoneNumber.java from:
import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.CordovaPlugin;
import org.apache.cordova.api.PluginResult;
To:
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.PluginResult;
It compiles and launches on the device, yet I have no SIM yet to confirm that you really can retrieve the phone number. If someone can test it, I would be really happy to get feedback.
@Unknown
ReplyDeleteYeah, that looks correct. I haven't had the chance to go through all my plugins to update them to 3.0.0 but I hope to get to it soon.
Hi Simon,
ReplyDeleteI want to access sms messages from my android device into listview. After accessing messages if we get new message automatically the list should be refresh. And if we delete any message from the list the message have to be deleted from the list and device.
Please help me it is very useful for me.
Thanks in Advance.
Here is the sample code written by me
List smsList = new ArrayList();
Uri uri = Uri.parse("content://sms/");
Cursor c= getContentResolver().query(uri, null, null ,null,null);
startManagingCursor(c);
// Read the sms data and store it in the list
if(c.moveToFirst()) {
for(int i=0; i < c.getCount(); i++) {
SMSData sms = new SMSData();
sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString());
sms.setDate(c.getString(c.getColumnIndexOrThrow("date")).toString());
smsList.add(sms);
c.moveToNext();
}
}
c.close();
// Set smsList in the ListAdapter
setListAdapter(new ListAdapter(this, smsList));
@Rahul kumar
ReplyDeleteLook at this stack overflow answer:
http://stackoverflow.com/questions/2584058/android-querying-the-sms-contentprovider
hi Simon,
ReplyDeletei am trying to use this with phoneGap, i have follow all the steps which u have mention in "https://github.com/macdonst/TelephoneNumberPlugin". then it is shown Jquery error : can't find variable Cordova in teliphonenumber.js.
and can't find the variable require in cordova.js.. please tell me what is the issue
@sandeep parashar
ReplyDeleteHave you loaded the cordova.js file?
Okay not very good at JQuery yet so bare with me. What am I doing wrong in this http://pastebin.com/QKbsZPhp
ReplyDelete@Ben Dorsi -Todaro
ReplyDeleteNowhere in your sample do I see you loading the PhoneGap/Cordova JavaScript file which is necessary for my telephone number plugin to work.
HI Simon,
ReplyDeleteThanks for great post, I used this code in my sample app its working great, but for some mobile its returning null value in the place of mobile number, can you please help me on this issue its great full for me
@Vasu Nanguluri
ReplyDeleteNot all mobile phone vendor's put the phone number on the SIM. That is probably what is happening to you. I had the same problem using T-Mobile in the Netherlands.
Hi Simon...i am getting the error "Class not found" what could be the problem?
ReplyDelete@Flanagan Khumbula
ReplyDeleteThat generally means you forgot to add the plugin line to plugins.xml or config.xml depending on your version of PhoneGap.
Hi there, i have added the plugin in my project in the src folder then edited the config.xml and the index.html and uploaded it to build.phonegap.com but it says this prooject has no plugins please help
ReplyDelete@muneeb khan
ReplyDeleteSorry I don't use the build.phonegap.com site for my own apps. I think you'd have to follow their directions on how to add a custom plugin like this one.
Hello Simon,
ReplyDeleteGreat post,
I have not implemented this yet,
But I am very happy to see it.
This is exactly what I was looking for :)
hii simon plz help me i am using cordova 2.1.0 . when i am implementing this i have get "errr= class not found" . i have added plugin to my config.xml.
ReplyDelete@Ganesh Sharma
ReplyDeleteIf I remember correctly the "cordova" object was not in 2.1 so you may need to update your version of PhoneGap in order to use this plugin.
How it is working with dual sim mobile phones ?
ReplyDelete@Noman Sadiq
ReplyDeleteI don't know as I've never tested on a dual sim phone but I have a feeling it will only get the "Line 1" phone number.
Followed the instructions. But, I get this error:
ReplyDelete"The following plugin, plugin version or a dependancy of this plugin is not on npm: TelephoneNumber".
Please help.
@Sudhir it's not on NPM. Someday I will have to add them someday.
ReplyDelete