Vraag Android-API voor dual simkaart


Er zijn verschillende vragen over toegang tot dual SIM-functies via de Android SDK, die allemaal worden beantwoord met korte verklaringen dat dergelijke functies niet worden ondersteund in Android.

Desondanks bestaan ​​er dual-SIM-telefoons en applicaties zoals Multisim lijken dit op een manier te kunnen detecteren die onafhankelijk is van de fabrikant.

Dus begin met die erkenning, laat me proberen wat meer gerichte vragen te stellen:

  • Betekent "Android SDK biedt geen ondersteuning voor meerdere SIM-functies" betekent dat deze functies niet bestaan, of dat het alleen maar een slecht idee is om ze te gebruiken?
  • Is er een Android-contentprovider of een intern pakket (com.android ...) met informatie over de SIM-kaart? (TelephonyManager heeft, voor zover ik kan zien in de documenten en de code, geen melding gemaakt van meerdere simkaarten)
  • Bestaan ​​er rapporten van fabrikanten die meerdere SIM-functies aan ontwikkelaars aanbieden?
  • Als ik zou zoeken naar ongedocumenteerde functionaliteit van een fabrikant, hoe zou ik dat dan aanpakken?

(Overigens, het punt van dit alles is slechts om dit algoritme te implementeren: stuur een sms met de SIM-kaart 1; als de bezorging mislukt, schakelt u over naar SIM-kaart 2 en verzendt u het bericht op die manier opnieuw.)


26
2017-07-03 06:14


oorsprong


antwoorden:


Android ondersteunt niet meerdere SIM-functies voor API 22. Maar vanaf Android 5.1 (API-niveau 22) begon Android meerdere simkaarten te ondersteunen. Meer informatie over Android-documentatie

Referentie van dit Origineel antwoord


5
2017-12-08 08:08



er zijn 3 verschillende categorieën ...

  1. functies ondersteund en gedocumenteerd
  2. Functies beschikbaar en niet-gedocumenteerd
  3. functies niet beschikbaar

Dus de dual sim-functies zijn beschikbaar, maar niet gedocumenteerd en worden daarom niet officieel ondersteund.

Dit betekent echter niet dat het niet bruikbaar zal zijn. Het betekent alleen dat Android (of zelfs google of zelfs fabrikant) niet aansprakelijk is voor het ondersteunen van de functionaliteit van uw apps.

Maar het zou gewoon kunnen werken, want bijvoorbeeld de contacten zijn vergelijkbaar.

Je zou dan kunnen vragen hoe iedereen over de functies zou weten als het niet gedocumenteerd is. Hé, android is open source .. ga de code in kijken en vind het voor jezelf. Dat is wat ik denk dat de multi-sim ontwikkelaars deden.


8
2017-07-03 06:22



Je kunt gebruiken MultiSim bibliotheek om details van multi-sim apparaten te krijgen.

Beschikbare informatie van elke simkaart: IMEI, IMSI, SIM-serienummer, SIM-status, SIM-operatorcode, SIM-operatornaam, SIM-land ISO, netwerkoperatorcode, netwerkoperatornaam, netwerkexploitant iso, netwerktype, roamingstatus.

Voeg de onderstaande regels toe in uw Grading-script op app-niveau:

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

Vergeet niet de vereiste toestemming toe te voegen in AndroidManifest.xml:

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

Gebruik vergelijkbare code in uw 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
2018-01-09 09:09



 <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                //

    }
   }
}

dit is ook werken voor dual sim, en je hoeft deze ontvanger niet te bellen omdat deze op afstand zal werken


-1
2017-07-15 06:19