API de carte SIM double pour Android

Il ya plusieurs questions sur l'accès aux fonctionnalités SIM duales via le SDK Android, qui Tous sont répondus avec de brèves déclarations que de telles fonctionnalités ne sont pas pris en charge dans Android.

malgré cela, les téléphones SIM doubles existent, et les applications comme MultiSim semblent être en mesure de détecter cette sorte de fabricant indépendant.

donc, en commençant par cette reconnaissance, laissez-moi essayer de demander un peu plus questions pointées:

  • est-ce que" Android SDK ne supporte pas plusieurs fonctionnalités SIM " signifie que ces fonctionnalités n'existent pas, ou que c'est simplement une mauvaise idée d'essayer de les utiliser?
  • Existe-t-il un fournisseur de contenu Android ou un paquet interne (com.Android...) qui fournit des informations sur la carte SIM? (TelephonyManager, aussi loin que je peux voir dans la documentation et le code, n'a aucune mention de plusieurs cartes SIM)
  • y a-t-il un rapport de tout fabricant exposant de multiples fonctionnalités SIM aux développeurs?
  • si je devais chercher une fonctionnalité non documentée chez un fabricant, comment je m'y prendrais-je?

(soit dit en passant, le but de tout ceci est simplement de mettre en œuvre cet algorithme: envoyer un SMS avec la carte SIM 1; si la livraison échoue, passer à la carte SIM 2 et renvoyer le message de cette façon.)

26
demandé sur adam.baker 2012-07-03 10:14:37

4 réponses

Android ne prend pas en charge plusieurs fonctionnalités SIM avant API 22. Mais à partir D'Android 5.1 (niveau API 22), Android a commencé à prendre en charge plusieurs SIMs. Plus de détails sur documentation Android

référence de cette réponse originale

5
répondu mgcaguioa 2017-05-23 10:30:08

il y a 3 catégories différentes ...

  1. caractéristiques prises en charge et documentées
  2. caractéristiques disponibles et non documentées
  3. caractéristiques non disponibles

ainsi, les caractéristiques sim doubles sont disponibles mais non documentées et donc pas officiellement prises en charge.

ayant dit que cela ne signifie pas qu'il ne sera pas utilisable , il signifie Juste que android(ou pour matter google ou même manufaturer) n'est pas tenu de prendre en charge la fonctionnalité de vos applications.

mais il pourrait tout simplement fonctionner, par exemple les contacts est une chose similaire.

vous pourriez alors demander comment tout le monde serait au courant des caractéristiques si dans le cas où il n'est pas documenté.. Hey android est open source .. allez chercher le code et trouvez-le vous-même . C'est ce que les développeurs multi sim ont fait.

8
répondu Gaurav Shah 2012-07-03 06:22:23

vous pouvez utiliser la bibliothèque MultiSim pour obtenir des détails des appareils multi-sim.

informations disponibles sur chaque carte sim: IMEI, IMSI, numéro de série SIM, état SIM, code D'opérateur SIM, nom D'opérateur SIM, pays SIM iso, code d'opérateur réseau, nom d'opérateur réseau, opérateur réseau iso, type de réseau, statut d'itinérance.

il suffit d'ajouter les lignes ci-dessous dans votre script Gradle au niveau de l'application:

dependencies {
    compile 'com.kirianov.multisim:multisim:2.0@aar'
}

n'oubliez pas ajouter obligatoire permission dans AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

utilisez un code similaire dans votre code:

MultiSimTelephonyManager multiSimTelephonyManager = new MultiSimTelephonyManager(this);
// or
MultiSimTelephonyManager multiSimTelephonyManager = new MultiSimTelephonyManager(this, new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    updateInfo();
  }
});


public void updateInfo() {

  // for update UI
  runOnUiThread(new Runnable() {
    @Override
    public void run() {
      multiSimTelephonyManager.update();
      useInfo();
    }
  }

  // for update background information
  multiSimTelephonyManager.update();
  useInfo();
}

public void useInfo() {

  // get number of slots:
  if (multiSimTelephonyManager != null) {
     multiSimTelephonyManager.sizeSlots();
  }

  // get info from each slot:
  if (multiSimTelephonyManager != null) {
    for(int i = 0; i < multiSimTelephonyManager.sizeSlots(); i++) {
      multiSimTelephonyManager.getSlot(i).getImei();
      multiSimTelephonyManager.getSlot(i).getImsi();
      multiSimTelephonyManager.getSlot(i).getSimSerialNumber();
      multiSimTelephonyManager.getSlot(i).getSimState();
      multiSimTelephonyManager.getSlot(i).getSimOperator();
      multiSimTelephonyManager.getSlot(i).getSimOperatorName();
      multiSimTelephonyManager.getSlot(i).getSimCountryIso();
      multiSimTelephonyManager.getSlot(i).getNetworkOperator();
      multiSimTelephonyManager.getSlot(i).getNetworkOperatorName();
      multiSimTelephonyManager.getSlot(i).getNetworkCountryIso();
      multiSimTelephonyManager.getSlot(i).getNetworkType();
      multiSimTelephonyManager.getSlot(i).isNetworkRoaming();
    }
  }
}

// or for devices above android 6.0
MultiSimTelephonyManager multiSimTelephonyManager = new MultiSimTelephonyManager(MyActivity.this, broadcastReceiverChange);

Usage:
// get info about slot 'i' by methods:
multiSimTelephonyManager.getSlot(i).

Force update info
// force update phone info (needed on devices above android 6.0 after confirm permissions request)
multiSimTelephonyManager.update();

Handle of permissions request (6.0+)
// in YourActivity for update info after confirm permissions request on  devices above android 6.0
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (multiSimTelephonyManager != null) {
        multiSimTelephonyManager.update();
    }
}
8
répondu Tapa Save 2018-06-10 00:22:28
 <receiver
     android:name=".SimChangedReceiver"
    android:enabled="true"
    android:process=":remote" >
    <intent-filter>
        <action android:name="android.intent.action.SIM_STATE_CHANGED" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
 </receiver>

SimChangedReceiver class

public class SimChangedReceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action.equalsIgnoreCase("android.intent.action.SIM_STATE_CHANGED")) {
        Log.d("SimChangedReceiver", "--> SIM state changed <--");   

      //            do code  whatever u want to apply action                //

    }
   }
}

c'est le travail pour sim double aussi , et vous n'avez pas besoin d'appeler ce récepteur parce qu'il va fonctionner à distance

-1
répondu Vaishali Sutariya 2016-01-19 11:23:56