Android双SIM卡API

有关通过Android SDK访问双SIMfunction的几个问题,所有这些都回答了简短的声明,这些function在Android中不受支持。

尽pipe如此,双SIM卡手机确实存在,像MultiSim这样的应用似乎能够以某种独立于制造商的方式检测到这一点。

所以,从这个承认开始,让我试着问一些更尖锐的问题:

  • “Android SDK不支持多个SIMfunction”是指这些function不存在,或者尝试使用它们只是一个坏主意?
  • 有没有提供SIM卡信息的Android内容提供商或内部软件包(com.android …)? (TelephonyManager,就我所知,在文档和代码中,没有提到多个SIM卡)
  • 是否有任何制造商向开发者公开多个SIMfunction的报告?
  • 如果我要从制造商那里查找无证的function,我该怎么办?

(顺便说一句,这一切只是为了实现这个algorithm:用SIM卡1发送短信,如果发送失败,切换到SIM卡2,然后重新发送信息。

Android在API 22之前不支持多个SIMfunction。但从Android 5.1(API等级22)开始,Android开始支持多个SIM。 有关Android文档的更多详情

从这个原始答复引用

有3个不同的类别…

  1. function支持和logging
  2. function可用和未logging
  3. function不可用

所以双卡function是可用的,但没有logging,因此不正式支持。

说了这并不意味着它不会被使用,它只是意味着Android(或为此,谷歌或甚至manufaturer)是不负责支持您的应用程序的function。

但它可能只是工作,因为例如,接触是一个类似的事情。

然后,你可能会问,如果没有logging,每个人如何知道这些function。嘿,android是开源的..去看看代码,find它自己。 那就是我猜想多模拟开发者所做的。

您可以使用MultiSim库从多SIM设备获取详细信息。

sim卡,SIM卡卡号,SIM卡卡号,SIM卡卡号,SIM卡号码,sim卡号,networking运营商代码,networking运营商名称,networking运营商iso,networkingtypes,networking漫游等信息。

只需在应用程序build.gradle中通过gradle依赖关系添加库:

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

不要忘记在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(); } } 
  <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 // } } } 

这也是双卡的工作,你不需要调用这个接收器,因为它会远程运行