After searching the API and no luck, mybe anyone know how could I retrieve the SIM ID of the device?
thanks,
ray.
Here is the code to get International Mobile Subscriber Identity (IMSI No.) id and phone id (IMEI No.) and Sim No. programmatically
Before doing this also set the user permission in the manifest file "android.permission.READ_PHONE_STATE"
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String imsi = mTelephonyMgr.getSubscriberId();
String imei = mTelephonyMgr.getDeviceId();
String simno = mTelephonyMgr.getSimSerialNumber();
Log.v("", ""+imsi);
Log.v("", ""+imei);
Log.v("", ""+simno);
Frrom wikiPedia
The Id = Issuer identification number
(IIN) Maximum of seven digits: Major
industry identifier (MII), 2 digits,
89 for telecommunication purposes.
Country code, 1-3 digits, as defined
by ITU-T recommendation E.164. Issuer
identifier, 1-4 digits.
so the API is :
public String getSimCountryIso ()
public String getSimSerialNumber ()
public String getSubscriberId ()
To retrieve the IMSI (subscriber ID in the SIM), Use the getSubscriberId method in the TelephonyManager API.
Related
I have tried to these methods such as IMEI,MEID,mac address,android_id, but all not OK.
How to get unique device numer in Android?
There are several Unique Identifiers available for Android devices
IMEI
TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String imei = TelephonyMgr.getDeviceId();
permission
android.permission.READ_PHONE_STATE
WLAN MAC Address
WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String wanMAC = wifi .getConnectionInfo().getMacAddress();
permission
android.permission.ACCESS_WIFI_STATE
Bluetooth MAC Address
BluetoothAdapter bluetoothAdapter =BluetoothAdapter.getDefaultAdapter();
String bluetoothMAC = bluetoothAdapter .getAddress();
permission
android.permission.BLUETOOTH
Android ID
String androidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
As the requirement for most of the applications is to identify a particular installation and not a physical device, a good solution to get the unique id for a user if to use UUID class. The following solution has been presented by Reto Meier from Google in a Google I/O presentation :
private static String uniqueID = null;
private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
public synchronized static String id(Context context) {
if (uniqueID == null) {
SharedPreferences sharedPrefs = context.getSharedPreferences(
PREF_UNIQUE_ID, Context.MODE_PRIVATE);
uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
if (uniqueID == null) {
uniqueID = UUID.randomUUID().toString();
Editor editor = sharedPrefs.edit();
editor.putString(PREF_UNIQUE_ID, uniqueID);
editor.commit();
}
}
return uniqueID;
}
UUID.randomUUID() method generates an unique identifier for a specific installation. You have just to store that value and your user will be identified at the next launch of your application. You can also try to associate this solution with Android Backup service to keep the information available to the user even if he installs your application on the other device.
You can explore more at https://medium.com/#ssaurel/how-to-retrieve-an-unique-id-to-identify-android-devices-6f99fd5369eb
In Android 10 you can't have access to non resettable device ids, like IMEI ,MEID etc.
So I think your best chance is creating a UUID. You can do that using the code below and saving this UUID into database or preference file.
String uniqueID = UUID.randomUUID().toString();
As a random number, everytime you call this method it'll return a different code, and I think is not you are looking for.
To get a "unique ID" from UUID, the best choise is the code below.It will work fine, but the documentation ask to avoid using Android_ID too.
String androidId = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.ANDROID_ID);
UUID androidId_UUID = UUID
.nameUUIDFromBytes(androidId.getBytes("utf8"));
This code will give you a almost unique code because if the user do a factory reset, this number would be changed.
I'm looking for another way to get a unique ID but, until now, I couldn't find.
Here ar some Android Developers documentation that should be usefull.
Good pratices to define a unique ID
https://developer.android.com/training/articles/user-data-ids
How to define a unique Id based in you use case:
https://developer.android.com/training/articles/user-data-ids#common-use-cases
I hope this could help someone.
Below code is I used in my project
To get Unique Android Id
static String androidID = Settings.Secure.getString(MyApplication.getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
I used this as a global so i can use anywhere in my project
To retrieve the unique ID associated to your device, you can use the following code :
import android.telephony.TelephonyManager;
import android.content.Context;
// ...
TelephonyManager telephonyManager;
telephonyManager = (TelephonyManager) getSystemService(Context.
TELEPHONY_SERVICE);
/*
* getDeviceId() returns the unique device ID.
* For example,the IMEI for GSM and the MEID or ESN for CDMA phones.
*/
String deviceId = telephonyManager.getDeviceId();
/*
* getSubscriberId() returns the unique subscriber ID,
* For example, the IMSI for a GSM phone.
*/
String subscriberId = telephonyManager.getSubscriberId();
Secure Android ID
String androidId = Settings.Secure.getString(getContentResolver(),
Settings.Secure.ANDROID_ID);
By using this below method i am getting information of sim one
TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
// Get the SIM country ISO code
String simCountry = telephonyManager.getSimCountryIso();
Log.e("Show:", simCountry);
// Get the operator code of the active SIM (MCC + MNC)
String simOperatorCode = telephonyManager.getSimOperator();
Log.e("Show:", simOperatorCode);
// Get the name of the SIM operator
String simOperatorName = telephonyManager.getSimOperatorName();
Log.e("Show:", simOperatorName);
// Get the SIM’s serial number
String simSerial = telephonyManager.getSimSerialNumber();
Log.e("Show:", simSerial);
// Get the phone number
String mPhoneNumber = telephonyManager.getLine1Number();
Log.e("Show:", mPhoneNumber);
how to get information of second sim of dual sim phone?
// Get the phone number
String mPhoneNumber = telephonyManager.getLine1Number();
Log.e("Show:", mPhoneNumber);
work on some device
Permission:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
So what should i do? Is there any Mistake?
From Android API 22 SubscriptionMananger is available
You just need to call
SubscriptionManager.from(context).getActiveSubscriptionInfo(1)
to get info about second sim card
I want to know user mobile number in Android. I used this code but I'm not getting number.
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String n = tm.getLine1Number();
Permission:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Is it compulsory to save number in android mobile settings --> about phone --> status --> myphone number
Any idea on this?
I think sim serial Number and sim number is unique. You can try this for get sim serial number and get sim number and Don't forget to add permission in manifest file.
TelephonyManager telemamanger = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String getSimSerialNumber = telemamanger.getSimSerialNumber();
String getSimNumber = telemamanger.getLine1Number();
And add below permission into your Androidmanifest.xml file.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Let me know if there is any issue.
Getting the Phone Number, IMEI, and SIM Card ID
TelephonyManager tm = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
For SIM card, use the getSimSerialNumber()
//---get the SIM card ID---
String simID = tm.getSimSerialNumber();
if (simID != null)
Toast.makeText(this, "SIM card ID: " + simID,
Toast.LENGTH_LONG).show();
Phone number of your phone, use the getLine1Number() (some device's dont return the phone number)
//---get the phone number---
String telNumber = tm.getLine1Number();
if (telNumber != null)
Toast.makeText(this, "Phone number: " + telNumber,
Toast.LENGTH_LONG).show();
IMEI number of the phone, use the getDeviceId()
//---get the IMEI number---
String IMEI = tm.getDeviceId();
if (IMEI != null)
Toast.makeText(this, "IMEI number: " + IMEI,
Toast.LENGTH_LONG).show();
Permissions needed
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Update: This answer is no longer available as Whatsapp had stopped exposing the phone number as account name, kindly disregard this answer.
=================================================================================
Its been almost 6 months and I believe I should update this with an alternative solution you might want to consider.
As of today, you can rely on another big application Whatsapp, using AccountManager. Millions of devices have this application installed and if you can't get the phone number via TelephonyManager, you may give this a shot.
Permission:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
Code:
AccountManager am = AccountManager.get(this);
Account[] accounts = am.getAccounts();
ArrayList<String> googleAccounts = new ArrayList<String>();
for (Account ac : accounts) {
String acname = ac.name;
String actype = ac.type;
// Take your time to look at all available accounts
System.out.println("Accounts : " + acname + ", " + actype);
}
Check actype for whatsapp account
if(actype.equals("com.whatsapp")){
String phoneNumber = ac.name;
}
Of course you may not get it if user did not install Whatsapp, but its worth to try anyway.
And remember you should always ask user for confirmation.
You have everything right, but the problem is with getLine1Number() function.
getLine1Number()- this method returns the phone number string for line
1, i.e the MSISDN for a GSM phone. Return null if it is unavailable.
this method works only for few cell phone but not all phones.
So, if you need to perform operations according to the sim(other than calling), then you should use getSimSerialNumber(). It is always unique, valid and it always exists.
You can use the TelephonyManager to do this:
TelephonyManager t = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
String number = t.getLine1Number();
Have you used
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
I am able to get the carrier name using the following snippet :
TelephonyManager telephonyManager = ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE));
String operatorName = telephonyManager.getNetworkOperatorName();
It works really fine.
I am also able to get the incoming call number using the following snippet:
private final PhoneStateListener phoneStateListener = new PhoneStateListener() {
#Override
public void onCallStateChanged(int state, String incomingNumber) {
String callState = "UNKNOWN";
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
}
}
}
I want to find out the carrier name / service provider name of an incoming number.
How can I achieve that?
Is that possible to get the incoming number's location, say, for example the country?
It's not possible to get the carrier name of a whatever mobile number neither with the Android API. At least is not that easy (and you could fall into some privacy related issue i think).
Read this article for more information:
http://sms411.net/2006/07/finding-out-someones-carrier/
Of course you can try to find the original carrier (using the prefix), but that could be different from the actual one...
It is not possible to retrieve the details of the carrier of a calling party programatically. Also, because of number portability, it is not possible to retrieve the carrier's name from the caller's phone number. You can, however, get the country information from the first few digits of the number. Refer List of country calling codes for more information.
from API Level 22 (Andrid 5.1) This APIs are available.
SubscriptionManager subscriptionManager = (SubscriptionManager)getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
List<SubscriptionInfo> subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList();
if (subscriptionInfoList != null && subscriptionInfoList.size() > 0) {
for (SubscriptionInfo info : subscriptionInfoList) {
String carrierName = info.getCarrierName().toString();
String mobileNo = info.getNumber();
String countyIso = info.getCountryIso();
int dataRoaming = info.getDataRoaming();
}
}
How do I access the SIM serial number and IMSI in Android?
Check this Access the SIM Card with an Android Application?
You can get sim details using the following code
mTelephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String imei = mTelephonyMgr.getDeviceId();
String country= mTelephonyMgr.getSimCountryIso();
String SimOperator =mTelephonyMgr.getSimOperatorName();
String SimSerialNumber= mTelephonyMgr.getSimSerialNumber();
int SimState= mTelephonyMgr.getSimState();
String SubscriberId= mTelephonyMgr.getSubscriberId();
String DeviceId= mTelephonyMgr.getDeviceId();
String mob=mTelephonyMgr.getLine1Number();