30

Android SDK を介してデュアル SIM 機能にアクセスすることに関していくつかの質問がありますが、そのすべてに対して、そのような機能は Android ではサポートされていないという簡単な説明で回答されています。

それにもかかわらず、デュアル SIM 電話は存在し、MultiSimのようなアプリケーションは、メーカーに依存しない何らかの方法でこれを検出できるようです。

ですから、その認識から始めて、いくつかのより鋭い質問をしてみましょう。

  • 「Android SDK は複数の SIM 機能をサポートしていません」とは、これらの機能が存在しないことを意味しますか、それとも、それらを使用しようとするのは単に悪い考えであることを意味しますか?
  • SIM カード情報を提供する Android コンテンツ プロバイダまたは内部パッケージ (com.android...) はありますか? (TelephonyManager は、ドキュメントとコードで確認できる限り、複数の SIM カードについて言及していません)
  • 複数の SIM 機能を開発者に公開しているメーカーの報告はありますか?
  • メーカーから文書化されていない機能を探す場合、どうすればよいでしょうか?

(ちなみに、これらすべてのポイントは、単にこのアルゴリズムを実装することです。SIM カード 1 で SMS を送信します。配信に失敗した場合は、SIM カード 2 に切り替えて、その方法でメッセージを再送信します。)

4

6 に答える 6

11

ライブラリを使用MultiSimして、マルチ SIM デバイスから詳細を取得できます。

各 SIM カードから入手可能な情報: IMEI、IMSI、SIM シリアル番号、SIM 状態、SIM オペレーター コード、SIM オペレーター名、SIM 国 iso、ネットワーク オペレーター コード、ネットワーク オペレーター名、ネットワーク オペレーター iso、ネットワーク タイプ、ローミング ステータス。

アプリ レベルの 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);

使用法:

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

強制更新情報:

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

アクセス許可要求のハンドル (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();
    }
}
于 2017-01-09T09:09:05.697 に答える
8

3つの異なるカテゴリがあります...

  1. サポートおよび文書化された機能
  2. 利用可能で文書化されていない機能
  3. 利用できない機能

したがって、デュアル SIM 機能は利用可能ですが、文書化されていないため、公式にはサポートされていません。

使用できないという意味ではありませんが、Android(またはGoogleまたはメーカーでさえも)がアプリの機能をサポートする責任がないことを意味します。

しかし、それはうまくいくかもしれません。たとえば、連絡先は似たようなものです。

次に、文書化されていない場合に備えて、機能について誰もがどのように知っているかを尋ねるかもしれません..ちょっとアンドロイドはオープンソースです..コードを調べて、自分で見つけてください. それが、マルチ sim の開発者がしたことだと思います。

于 2012-07-03T06:22:23.280 に答える
5

Android は、API 22 より前は複数の SIM 機能をサポートしていません。ただし、Android 5.1 (API レベル 22) 以降、Android は複数の SIM のサポートを開始しました。Android ドキュメントの詳細

この元の回答からの参照

于 2015-12-08T08:08:00.493 に答える
1

SubscriptionInfoクラスを使用してそれを達成できます。

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
        val mSubscriptionManager = getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
        // val mSubscriptionManager = SubscriptionManager.from(baseContext)
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
            val subscriptions = mSubscriptionManager.activeSubscriptionInfoList
        //loop through number of SIMS inserted
            for (subscriptionInfo in subscriptions) {
                //the number of this subscription if the calling app has been granted the READ_PHONE_NUMBERS permission, or an empty string otherwise
                Log.v("SIM", subscriptionInfo.number)
                //the ISO country code
                Log.v("SIM", subscriptionInfo.countryIso)
                //the name displayed to the user that identifies Subscription provider name
                Log.v("SIM", subscriptionInfo.carrierName.toString())
                //the name displayed to the user that identifies this subscription
                Log.v("SIM", subscriptionInfo.displayName.toString())
                //The MCC, as a string. This value may be null.
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    Log.v("SIM", subscriptionInfo.mccString.toString())
                } else {
                    Log.v("SIM", subscriptionInfo.mcc.toString())
                }
                //The MNC, as a string. This value may be null.
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                    Log.v("SIM", subscriptionInfo.mncString.toString())
                } else {
                    Log.v("SIM", subscriptionInfo.mnc.toString())
                }
            }
        }
    }
于 2020-07-15T08:46:00.387 に答える
-2
 <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でも機能します。リモートで実行されるため、このレシーバーを呼び出す必要はありません

于 2014-07-15T06:19:17.507 に答える