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.)
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
il y a 3 catégories différentes ...
- caractéristiques prises en charge et documentées
- caractéristiques disponibles et non documentées
- 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.
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();
}
}
<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