pbakondy / cordova-plugin-sim

:cherries: A cordova plugin to get the device's SIM data (carrier name, mcc mnc, country code, telephonenumber, etc)
MIT License
163 stars 100 forks source link

cordova-plugin-sim

npm Code Climate Platform Donate

This is a cordova plugin to get data from the SIM card like the carrier name, mcc, mnc and country code and other system dependent additional info.

Installation

cordova plugin add cordova-plugin-sim

Supported Platforms

Usage

document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() {
  window.plugins.sim.getSimInfo(successCallback, errorCallback);
}

function successCallback(result) {
  console.log(result);
}

function errorCallback(error) {
  console.log(error);
}

// Android only: check permission
function hasReadPermission() {
  window.plugins.sim.hasReadPermission(successCallback, errorCallback);
}

// Android only: request permission
function requestReadPermission() {
  window.plugins.sim.requestReadPermission(successCallback, errorCallback);
}

The plugin returns a JSON object. Return values:

Field carrierName may remain empty, dependent on the mobile provider.

On Windows Phone access to countryCode, MCC and MNC is not made provided (returns empty string).

You can extract country and carrier data from MCC and MNC codes, read further on Wikipedia and ITU-T.

You can find the name of mobile provider using mcc-mnc-list npm package.

Ionic 2 Usage

import { Sim } from 'ionic-native';

Sim.getSimInfo().then(
  (info) => console.log('Sim info: ', info),
  (err) => console.log('Unable to get sim info: ', err)
);

Sim.hasReadPermission().then(
  (info) => console.log('Has permission:', info)
);

Sim.requestReadPermission().then(
  () => console.log('Permission granted'),
  () => console.log('Permission denied')
);

Required: ionic-native v2.2.13

See Ionic Native documentation.

Android Quirks

Under the hood

This plugin uses two different Android APIs to receive SIM data:

Since Android 6 (API level 23) a few methods of TelephonyManager require permission READ_PHONE_STATE.

All methods of SubscriptionManager require permission READ_PHONE_STATE.

SubscriptionManager is able to access multiple SIM data. The return object of this cordova plugin provides the details of the available sim cards in an array (cards).

Return object

1) Notice: the content of phoneNumber is unreliable (see this, this, and this article). Sometimes phoneNumber is only an empty string.

Android Emulator results

{
  "carrierName": "Android",
  "countryCode": "us",
  "mcc": "310",
  "mnc": "260",
  "phoneNumber": "15555215554",
  "deviceId": "0000000000000000",
  "simSerialNumber": "89014103211118510720",
  "subscriberId": "310260000000000",
  "callState": 0,
  "dataActivity": 0,
  "networkType": 3,
  "phoneType": 1,
  "simState": 5,
  "isNetworkRoaming": false
}

List of Call State Codes and Meanings

Code Constant Meaning
0 CALL_STATE_IDLE No activity
1 CALL_STATE_RINGING Ringing. A new call arrived and is ringing or waiting. In the latter case, another call is already active.
2 CALL_STATE_OFFHOOK Off-hook. At least one call exists that is dialing, active, or on hold, and no calls are ringing or waiting.

List of Data Activity Codes and Meanings

Code Constant Meaning
0 DATA_ACTIVITY_NONE No traffic.
1 DATA_ACTIVITY_IN Currently receiving IP PPP traffic.
2 DATA_ACTIVITY_OUT Currently sending IP PPP traffic.
3 DATA_ACTIVITY_INOUT Currently both sending and receiving IP PPP traffic.
4 DATA_ACTIVITY_DORMANT Data connection is active, but physical link is down

List of Network Type Codes and Meanings

Code Constant Meaning
0 NETWORK_TYPE_UNKNOWN unknown
1 NETWORK_TYPE_GPRS GPRS
2 NETWORK_TYPE_EDGE EDGE
3 NETWORK_TYPE_UMTS UMTS
4 NETWORK_TYPE_CDMA CDMA: Either IS95A or IS95B
5 NETWORK_TYPE_EVDO_0 EVDO revision 0
6 NETWORK_TYPE_EVDO_A EVDO revision A
7 NETWORK_TYPE_1xRTT 1xRTT
8 NETWORK_TYPE_HSDPA HSDPA
9 NETWORK_TYPE_HSUPA HSUPA
10 NETWORK_TYPE_HSPA HSPA
11 NETWORK_TYPE_IDEN iDen
12 NETWORK_TYPE_EVDO_B EVDO revision B
13 NETWORK_TYPE_LTE LTE
14 NETWORK_TYPE_EHRPD eHRPD
15 NETWORK_TYPE_HSPAP HSPA+
16 NETWORK_TYPE_GSM GSM
17 NETWORK_TYPE_TD_SCDMA TD-SCDMA
18 NETWORK_TYPE_IWLAN IWLAN

List of Phone Type Codes and Meanings

Code Constant Meaning
0 PHONE_TYPE_NONE none
1 PHONE_TYPE_GSM GSM
2 PHONE_TYPE_CDMA CDMA
3 PHONE_TYPE_SIP SIP

List of SIM State Codes and Meanings

Code Constant Meaning
0 SIM_STATE_UNKNOWN Unknown. Signifies that the SIM is in transition between states. For example, when the user inputs the SIM pin under PIN_REQUIRED state, a query for sim status returns this state before turning to SIM_STATE_READY.
1 SIM_STATE_ABSENT No SIM card is available in the device
2 SIM_STATE_PIN_REQUIRED Locked: requires the user's SIM PIN to unlock
3 SIM_STATE_PUK_REQUIRED Locked: requires the user's SIM PUK to unlock
4 SIM_STATE_NETWORK_LOCKED Locked: requires a network PIN to unlock
5 SIM_STATE_READY Ready

Android 6.0 Permissions

Beginning in Android 6.0 (API level 23), users grant permissions to apps while the app is running, not when they install the app.

If the device is running Android 6.0 or higher, and your app's target SDK is 23 or higher: The app has to list the permissions in the manifest, and it must request each dangerous permission it needs while the app is running. The user can grant or deny each permission, and the app can continue to run with limited capabilities even if the user denies a permission request.

Note: Beginning with Android 6.0 (API level 23), users can revoke permissions from any app at any time, even if the app targets a lower API level. You should test your app to verify that it behaves properly when it's missing a needed permission, regardless of what API level your app targets.

// check permission
function hasReadPermission() {
  window.plugins.sim.hasReadPermission(successCallback, errorCallback);
}

// request permission
function requestReadPermission() {
  window.plugins.sim.requestReadPermission(successCallback, errorCallback);
}

This plugin needs READ_PHONE_STATE permission for getting the following values:

Wiki: How to test permissions

Build conflict with phonegap-facebook-plugin

Android SDK uses Gradle build tool to create Android builds. phonegap-facebook-plugin does not implement android-support-v4 dependency the recommended way, Gradle is not able to resolve the dependencies. The build process will fail.

I suggest to use another plugin for facebook usage:

iOS Quirks

Additional return value:

iOS Emulator results

{
  "carrierName": "",
  "countryCode": "",
  "mcc": "",
  "mnc": "",
  "allowsVOIP": false
}

Windows Phone Quirks

Additional return values:

Author

Peter Bakondy

LICENSE

cordova-plugin-sim is licensed under the MIT Open Source license. For more information, see the LICENSE file in this repository.