Android двойной SIM-карты API

Есть несколько вопросов о доступе к функциям Dual SIM через Android SDK, на все ответы с краткими заявлениями о том, что такие функции не поддерживаются в Android.

Несмотря на это, существуют два SIM-телефона, и такие приложения, как MultiSim, могут обнаружить это каким-то независимым от производителя способом.

Итак, начиная с этого подтверждения, позвольте мне попытаться задать еще несколько острых вопросов:

  • "Android SDK не поддерживает несколько функций SIM" означает, что эти функции не существуют или что это просто плохая идея, чтобы попытаться их использовать?
  • Есть ли поставщик контента Android или внутренний пакет (com.android...), который предоставляет информацию о SIM-карте? (TelephonyManager, насколько я могу видеть в документах и ​​коде, не упоминает несколько SIM-карт)
  • Есть ли отчет какого-либо производителя, предоставляющего разработчикам различные функции SIM-карты?
  • Если бы я искал недокументированную функциональность от производителя, как бы я это сделал?

(Кстати, суть всего лишь заключается в том, чтобы реализовать этот алгоритм: отправить SMS с SIM-картой 1, если сбой доставки, переключитесь на SIM-карту 2 и отправьте сообщение таким образом.)

Ответ 2

существует 3 разных категории...

  • поддерживаются и документируются
  • Возможности доступны и не документированы
  • недоступны

Таким образом, функции двойного sim доступны, но не документированы и, следовательно, официально не поддерживаются.

Сказав, что это не значит, что он не будет использоваться, это просто означает, что андроид (или, в этом случае, google или даже manufaturer) не несет ответственности за функциональность ваших приложений.

Но это может сработать, например, контакты аналогичны.

Затем вы можете спросить, как все будут знать об этих функциях, если в случае, если это не задокументировано. Эй, андроид - с открытым исходным кодом.. загляните в код и найдите его для себя. Вот что я думаю, что разработчики мульти-sim сделали.

Ответ 3

Вы можете использовать библиотеку MultiSim для получения информации о мульти-сим-устройствах.

Доступная информация с каждой сим-карты: imei, imsi, серийный номер sim, sim state, код оператора sim, имя оператора SIM, SIM-карта iso, код оператора сети, имя оператора сети, сетевой оператор iso, тип сети, сетевой роуминг.

Просто добавьте библиотеку зависимостей gradle в app build.gradle:

dependencies {
    compile 'com.kirianov.multisim:multisim:[email protected]'
}

Не забудьте добавить требуемое разрешение в AndroidManifest.xml:

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

Использовать аналогичный код в коде:

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();
    }
}

Ответ 4

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

    }
   }
}

Это также работа для двойного sim, и вам не нужно называть этот ресивер, потому что он будет удален удаленно