如何在Android模拟器中更改移动国家代码(MCC)?

16
我的Android应用需要根据不同的移动国家代码(MCC)做出不同的反应。
看起来它已经预设为mcc310(美国)。我可以通过TelephonyManager.getSimCountryIso()或使用资源文件夹如res/values-mcc123/读取这个值,但是我该如何在模拟器中设置这个值呢?
6个回答

17

要更改TelephonyManager.getSimCountryIso()返回的内容,只需执行以下操作

adb shell setprop gsm.sim.operator.iso-country no

现在它不返回任何值(挪威)。

如果你想改变TelephonyManager.getSimOperator()返回的值(MCC+MNC),那么执行

adb shell setprop gsm.sim.operator.numeric 24201

你已将MCC更改为242(挪威),将MNC更改为01(Telenor)。

要查看您可以更改哪些其他属性,请执行以下操作

adb shell getprop

已验证此方法适用于AVD和Genymotion。但是,这并不会使这些属性持久化。


这个可行!检查可以设置哪些属性的提示非常棒!谢谢。 - speedynomads
这对我不起作用,如果我在setprop之后立即执行getprop,我仍然得到“us”。你有什么想法为什么会这样? - Alexandru Cristescu
@AlexandruCristescu 这是在模拟器上吗? - Espen Riskedal
2
可能需要使用提升的权限,即:使用adb shellsu启动shell,然后尝试@EspenRiskedal在他的帖子中提出的建议。对我来说,这样做是有效的——如果没有超级用户权限,它就不起作用。 - PattaFeuFeu
1
Android模拟器的最新版本没有“su”,因此这个方法不再可行。 - Rasmusob
显示剩余3条评论

3

我发现在一些API级别中,这些属性的值是不同的。我尝试解决了这个问题。

你可以使用以下命令在API 26上更改该值:

  1. adb shell
  2. su
  3. setprop gsm.operator.numeric 280701

注意:有些模拟器需要重新启动。

在一些模拟器上,该属性的名称可能不同。

你可以按照以下步骤查找属性名称:

  1. adb shell
  2. 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来验证值是否已更改。


1
Android模拟器的最新版本没有“su”,因此这个方法不再可行。 - Rasmusob
su: 无法访问或未找到 - undefined

0

在模拟器中更改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

重启模拟器。


属性已设置,但我认为这不起作用 - 据我所知,TelephonyManager在返回getSimCountryIso()时不读取此属性。 - Espen Riskedal

0

在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

通过以同样的方式更改MSISDNIMEI的方法,黑客可能会实现这一点。


0

在模拟器上:进入“设置” ->“无线和网络” ->“移动网络” ->“接入点名称”。尝试更改设置APN中的MCC值,然后再尝试您的代码。


好主意,但是它没有起作用。当我尝试这个时,APN从列表中消失了,我的应用程序无法再访问网络了。 - neu242
在我的情况下,APN消失了,当我启动浏览器时出现了“无网络连接”的提示。但是当我确认警报后,我就能够上网冲浪了。行为很奇怪。无论如何,您可以在APN页面上执行“重置为默认值”,并恢复早期的APN设置。 - Samuh

0
请注意,依赖MCC并不总是在每个国家都正确的。例如,Digicell在多个国家使用一个MCC+MNC。同时要明白,从网络角度来看,整个MCC的概念相当荒谬。如果你在德国或荷兰,但两次都使用AT&T手机在T-Mobile上,那么知道你在哪个国家其实并不重要。

虽然我完全同意所说的,但这并没有回答实际问题。 - Andrejs Cainikovs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接