在 Android 中以编程方式打开 ServiceMode 菜单

标签: Android Galaxy
发布时间: 2014/3/5 0:14:56
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

如何打开以编程方式对三星手机的 Android ServiceMode菜单?
手动,能它通过拨号 ussd 代码 * #0011 #。

enter image description here

解决方法 1:

这是一项挑战,我一直寻找一个解决方案的几个小时。但恐怕我没有好消息。

1.第一次尝试 Intent.ACTION_DIAL

是真的一开始,就可能要直接调用 USSD 代码从一个应用程序 (使用意向 Intent.ACTION_DIAL),和甚至从一个网站,只使用"电话:"架构。这将打开拨号程序,放所需的数量。当你把最后一个 #,代码要自动获取发送,是几乎透明的用户,其相互作用并不是必需的。但是,实际上被认为是一个漏洞的系统,因为有人能写出的恶意软件,或甚至更多,在一个网站,甚至可以擦除您的手机或阻止 sim 卡中插入恶意代码。您可以阅读关于这一点,例如在此链接中2012 年 9 月,现在看来,三星终于修复这一漏洞例如如此你 S3 不是有这种能力。此时它将难找到任何设备仍然脆弱。

2.第二次尝试,解决方法

好在 Android 中的一切都是一个应用程序,甚至在手机本身是一个应用程序。那么,我们为什么不能尝试复制它的代码?和当用户手动发送 ussd 实际上,会发生什么呢?有过可能的答案:

  • 电话将代码发送到提供程序并作出反应,等待或
  • 电话没有本地的东西

容易测试: 我把我的手机放在飞行模式中,所以如果它要发送代码,希望它不能到。它是如我所料: 拨通了该代码,并在 ServiceMode 屏幕出现 !它是空的所以我们可以说拨号程序将打开一个系统应用程序,此应用程序调用该提供程序。它很容易找出的是此应用程序。在三星设备中,至少在 S4,其名称是 ServiceMode。你可以发现它在 Settings > Application manager > All 。所以我们可以试着找出启动更通过这一方式:

2.1.阅读的手机应用程序代码

我试了,但它是在开始时,很令人困惑于是到选项 2

2.2.检查服务模式应用程序

我打开 ES 文件浏览器 > 应用程序管理器。连接在电话里和在备份/手机我有 servicestatus apk。几分钟或逆工程后的,清单文件中的,作为揭示作为它使用要了那里可以看到一堆的活动和还几个广播的接收器。我不知道是什么更害怕。

2.2.1 让试与活动。

因为我们知道我们可以从另一种打开特定的应用程序,我将尝试写一个简单的应用程序,可打开此活动之一。这就像一样简单:

Intent i= new Intent(Intent.Action_MAIN);
i.setClass(  "package name",  "class name");
startActivity(i);

因为这个应用程序不是由开放启动器图标,它有不活动与意图的筛选器,让我们知道它是主要的活动。所以我要尝试至少他们几个。但不管怎么说,我看到了一些我不喜欢。以后我会告诉你。

我试过了,但是,不出所料,无法打开该活动。我找不到的异常活动。所以,让我们试带接收器。至少这会很有趣。

2.2.2 让试与接收器。

有几个,但我特别喜欢其中一个与此意图过滤器:

 <intent-filter>
                <action android:name="android.provider.Telephony.SECRET_CODE" />
  ... 

看起来不错。我去了哟 Telephony.java,和这那里我可以看到的地方:

   /**
     * Broadcast Action: A "secret code" has been entered in the dialer. Secret codes are
     * of the form *#*#<code>#*#*. The intent will have the data URI:</p>
     *
     * <p><code>android_secret_code://&lt;code&gt;</code></p>
     */
    public static final String SECRET_CODE_ACTION =
            "android.provider.Telephony.SECRET_CODE";

看起来很棒,其具体意图,也许我们需要的架构不是"电话:"但"android_secret_code: / /",可能代码必须是在不同的内部格式。我试过,更或较不只是为了好玩,因为我知道是我在活动中,看到了,这是同样的问题:

 <permission android:name="com.sec.android.app.servicemodeapp.permission.KEYSTRING" android:protectionLevel="signatureOrSystem" />

这款应用程序声明此权限,并每个组件使用它。所以,你知道如何声明和设置签名,或你,的否则你不能在所有与此应用程序进行交互的系统应用。

当然你不能想创建您自己的 servicemode 应用程序,因为您不会不是一个系统应用程序 (因为你必须通过一些会说一种悲伤"你以为你是谁"的固件应用程序) 执行这种与供应商沟通交流

结论

有什么我们可以在他的观点,至少用三星手机,和我们可以认为每个其他电话将相同。

替代品

好,其实都很好。但让我们看看:

选择 1。找到另一种的 ussd 代码

我们知道那里是 USSD 2 种。部分拨号时的最后一个 #,采取行动,将自动触发,和其他的这需要您按通话按钮。

如果您尝试使用一个第三方的拨号程序,你可以看到,

  • 当您拨打第一种类型的代码,什么都不触发在所有 (只有固件的拨号器可以触发这些)
  • 您可以使用另一种 (类型代码 + 新闻调用)。这意味着这种代码的风险较低,既然改变不了什么在设备中,因此允许吧
  • 当然,如果您键入的第一种类型的代码,然后按电话,你错误因为该代码不起作用这种方式。

所以,如果第三方可以发送该类型的代码,每个应用程序就可以了。所以如果你可以试着找出替代 ussd 代码,usser 在按通话按钮后触发该类型的你就能实现你的什么你需要。在这种情况下,您应该使用 Intent.ACTION_CALL 的意图

您使用 ACTION_DIAL 意图 //if,它打开拨号程序和把给定的数放进去。/ 同时,如果我们使用 ACTION_CALL,这款应用程序将直接调用。

Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+ "*" + Uri.encode("#") + "0011" + Uri.encode("#"))); //here you woud put your alternative code
startActivity(intent);

此外您会需要声明此清单中的权限

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>

也许你可以找到替代的代码,这样做,因为我见过很少几个互联网,但此时没有人为我工作。你可以试一试

备选案文 2。等待官方的 api 来

android 项目在技巧代码页中,有对添加 USSD API 支持的请求。它有很多用户,但我恐怕是很旧 (超过 5 年),那不是很好。不管怎么说,那会发生 android 瞬变电磁法可能会考虑准备 api,所以 app 可能宣布某些权限,使代码的某种类型的请求。但是,我知道,这可要一直等下去。

所以,该说什么。会运气寻找一个解决办法,或为您的应用程序的替代。我很抱歉我的研究并不是更有成效:(

官方微信
官方QQ群
31647020