web-dev-qa-db-ja.com

どのSIMが受信したかを把握する方法SMSデュアルSIMでAndroidデバイス

Android電話で受信したSMSをオンラインデータベースに同期するプロジェクトに取り組んでいます。getOriginatingAddress()メソッドを呼び出すことで送信者の番号を取得できます。しかし、できません。私のデバイスのどのSIMがSMSを受信したかを把握するための解決策を見つけてください。

私はそれについてウェブを検索しましたが、これを理解する方法を見つけることができませんでした。 SMS受信者の番号を取得する方法はありますか?

10
haider_kazal

私はこの問題に本当に苦労し、最終的に解決策を見つけましたが、APIレベル22以上でしかテストしませんでした。

受信したインテントの追加情報を確認する必要があります。私の場合、インテントの追加バンドルには、「スロット」と「サブスクリプション」という2つの便利なキーがあります。

次に例を示します。

public class IncomingSms extends BroadcastReceiver {

          public void onReceive(Context context, Intent intent) {

                // Retrieves a map of extended data from the intent.
                Bundle bundle = intent.getExtras();

                int slot = bundle.getInt("slot", -1);
                int sub = bundle.getInt("subscription", -1);

                /*
                  Handle the sim info
                */
            }
}

バンドル内のキーに関するドキュメントが見つからなかったため、これはデバイス/メーカーに依存する可能性があります。キーが異なるか、そのようなものであると想像できます。これは、バンドルのキーセットをダンプすることで確認できます。

Set<string> keyset = bundle.keySet();

編集:

SIMカードの電話番号に関する情報は、SIMカードに保存されていない場合は照会できない可能性があるため、まったく利用できない場合がありますが、他のすべての情報は、SubscriptionManagerを通じて利用できます。

SubscriptionManager manager = SubscriptionManager.from(appContext);
SubscriptionInfo = manager.getActiveSubscriptionInfo(sub);

または

SubscriptionInfo = manager.getActiveSubscriptionInfoForSimSlotIndex(slot);

そして、 SubscriptionInfo には、上で説明したように利用可能であることが保証されていない電話番号など、いくつかの有用な情報があります。

在庫のDual-SIMサポートAndroidがAPIレベル22から追加されたことにも言及するのを忘れました。

17
Levente Püsök

LeventePüs​​ök の答えを少し変更して使用しました。しかし、すべてのデバイスでテストしたわけではありません。

try {
Bundle bundle = intent.getExtras();
int slot = -1;
if (bundle != null) {
Set<String> keySet = bundle.keySet();
for(String key:keySet){
  switch (key){
    case "slot":slot = bundle.getInt("slot", -1);
    break;
    case "simId":slot = bundle.getInt("simId", -1);
    break;
    case "simSlot":slot = bundle.getInt("simSlot", -1);
    break;
    case "slot_id":slot = bundle.getInt("slot_id", -1);
    break;
    case "simnum":slot = bundle.getInt("simnum", -1);
    break;
    case "slotId":slot = bundle.getInt("slotId", -1);
    break;
    case "slotIdx":slot = bundle.getInt("slotIdx", -1);
    break;
    default:
      if(key.toLowerCase().contains("slot")|key.toLowerCase().contains("sim")){
       String value = bundle.getString(key, "-1");
       if(value.equals("0")|value.equals("1")|value.equals("2")){
         slot = bundle.getInt(key, -1);
       }
    }


  }
}

 Log.d("slot", "slot=>"+slot);

 }

}catch (Exception e){
Log.d(TAG, "Exception=>"+e);
 }
3
Mikael

SMSにはthread_idフィールドがあり、参加者セットに固有である可能性があります。同じ送信者と2つのSIMで異なる可能性があり、少なくとも区別するのに役立ちます。

0
Carlos Iglesias