私の Android アプリケーションは、異なるモバイル国コードに対して異なる反応をする必要があります。
mcc310 (US)にハードコーディングされているようです。TelephonyManager.getSimCountryIso()
この値は、リソース フォルダーから、またはリソース フォルダーを使用して読み取ることができますres/values-mcc123/
が、エミュレーターでこの値を設定するにはどうすればよいですか?
私の Android アプリケーションは、異なるモバイル国コードに対して異なる反応をする必要があります。
mcc310 (US)にハードコーディングされているようです。TelephonyManager.getSimCountryIso()
この値は、リソース フォルダーから、またはリソース フォルダーを使用して読み取ることができますres/values-mcc123/
が、エミュレーターでこの値を設定するにはどうすればよいですか?
返されるものを変更するTelephonyManager.getSimCountryIso()
には、単に実行します
adb shell setprop gsm.sim.operator.iso-country no
no (ノルウェー) を返すようになりました。
TelephonyManager.getSimOperator()
返されるもの (MCC + MNC)を変更する場合は、実行します。
adb shell setprop gsm.sim.operator.numeric 24201
MCC を 242 (ノルウェー) に、MNC を 01 (Telenor) に変更しました。
変更できる他のプロパティを確認するには、実行します
adb shell getprop
これは、AVD と Genymotion の両方で動作することが確認されています。ただし、これらのプロパティが永続的に変更されるわけではありません。
このプロパティの値は、API レベルによって異なることがわかりました。私はこの問題に対処しようとしました。
次のコマンドを使用して、API 26 の値を変更できます。
adb shell
su
setprop gsm.operator.numeric 280701
注:一部のエミュレーターでは再起動が必要です。
一部のエミュレーターでは、プロパティの名前が異なる場合があります
プロパティ名は次のように見つけることができます。
adb shell
getprop
次のようなデータが得られます。
...
[dalvik.vm.lockprof.threshold]: [500]
[dalvik.vm.stack-trace-file]: [/data/anr/traces.txt]
[dalvik.vm.usejit]: [true]
[dalvik.vm.usejitprofiles]: [true]
[debug.atrace.tags.enableflags]: [0]
[debug.force_rtl]: [0]
[dev.bootcomplete]: [1]
[drm.service.enabled]: [true]
[gsm.current.phone-type]: [1]
[gsm.defaultpdpcontext.active]: [true]
[gsm.network.type]: [LTE]
[gsm.nitz.time]: [1524141151210]
[gsm.operator.alpha]: [Android]
[gsm.operator.iso-country]: [us]
[gsm.operator.isroaming]: [false]
[gsm.operator.numeric]: [310260]
[gsm.sim.operator.alpha]: [Android]
[gsm.sim.operator.iso-country]: [us]
[gsm.sim.operator.numeric]: [310260]
[gsm.sim.state]: [READY]
[gsm.version.baseband]: [1.0.0.0]
[gsm.version.ril-impl]: [android reference-ril 1.0]
[hwservicemanager.ready]: [true]
[init.svc.adbd]: [running]
[init.svc.audio-hal-2-0]: [running]
[init.svc.audioserver]: [running]
[init.svc.bootanim]: [stopped]
[init.svc.camera-provider-2-4]: [running]
[init.svc.cameraserver]: [running]
...
numeric
出力をテキストファイルにコピーして検索します。プロパティ名を取得して使用するsetprop <property name> <new MCC MNC>
getProp
を使用して、値が変更されたかどうかを確認することもできます。
エミュレータで MCC+MNC を変更するには、ADB を使用する必要があります。エミュレータで MCC+MNC を変更するには、ADB に接続して次の手順を実行します。
adb -s 127.0.0.1:53001 shell
次に、そこに国コードを入力します。23801 はデンマークの国番号です。
setprop persist.<name of the emulator>.mccmnc 23801
Droid4X エミュレータの場合は、
setprop persist.droid4x.mccmnc 23801
エミュレータを再起動します。
エミュレーターの場合: [設定] -> [ワイヤレスとネットワーク] -> [モバイル ネットワーク] -> [アクセス ポイント名] に移動します。設定した APN の MCC 値を変更してから、コードを試してください。
Android エミュレーターの設定で MCC/MNC を変更することはできないようです。これを試みるたびに、事前に構成された「T-Mobile」APN がリストから消え、ネットワーク接続が失われます。変更後にエミュレーターが自発的に再起動することさえありました。
プログラムによる方法も機能しません。APN は直後に消えます。
root@generic_x86:/ # content update --uri content://telephony/carriers/ --bind name:s:'TheAPN' --bind apn:s:apn.operator.net --bind numeric:i:12345 --bind user:s: --bind password:s: --bind server:s: --bind proxy:s: --bind mmsproxy:s: --bind mmsc:s: --bind type:s: --bind mcc:i:123 --bind mnc:i:45 --bind current:i:1 --where _id=1
ただし、 MSISDNまたはIMEIを変更できるのと同じ方法でエミュレーターをハッキングすることで可能になる可能性があります。
MCC に依存することがすべての国で常に正しいとは限らないことを知っておいてください。たとえば、デジセルは複数の国で 1 つの MCC+MNC を使用します。また、ネットワークの観点から見ると、MCC の全体的な考え方はばかげていることも理解してください。AT&T ハンドセットで T-Mobile を使用している場合、ドイツにいるのかオランダにいるのかを知ることはあまり関係ありません。