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

时间:2013-11-27 16:42:52

标签: android mobile galaxy samsung-mobile

如何在Samsung手机上以编程方式打开Android ServiceMode 菜单? 手动,我可以通过拨打ussd代码*#0011#来实现。

enter image description here

4 个答案:

答案 0 :(得分:15)

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

<强> 1。首先尝试,Intent.ACTION_DIAL

在开始时,可​​以直接从应用程序(使用意图Intent.ACTION_DIAL)调用USSD代码,甚至可以从网站调用,只需使用&#34; tel:&#34;架构。打开拨号器,输入所需的号码。当您放入最后一个#时,代码会自动发送,对用户来说几乎是透明的,不需要进行交互。但这实际上被认为是系统的一个漏洞,因为有人可能会编写恶意软件,甚至更多,将恶意代码插入甚至可能擦除手机或阻止SIM卡的网站。您可以阅读此内容,例如in this link 截至2012年9月,似乎三星终于fixed that vulnerability所以例如你的S3无法做到这一点。在这一点上,很难找到任何仍然容易受到攻击的设备。

<强> 2。第二次尝试,解决方法

好的,Android中的所有内容都是应用,即使手机本身也是应用。那么,为什么我们不能尝试复制它的代码呢?实际上,当用户手动发送ussd时会发生什么? 答案太可能了:

  • 手机将代码发送给提供商并等待回复,或
  • 手机在本地执行某项操作

易于测试:我将手机置于飞行模式,所以如果必须发送代码,希望它能够。这是我的预期:我拨打了代码,出现了ServiceMode屏幕!它是空的,所以我们可以说拨号器打开一个系统应用程序,这个应用程序调用提供程序。 很容易找出这个应用程序。在三星设备中,至少在S4中,它的名字是ServiceMode。您可以在Settings > Application manager > All找到它。因此,我们可以尝试通过以下方法之一了解它的推出方式:

<强> 2.1。阅读手机应用程序代码

我试过,但一开始很混乱,所以我选择了2

<强> 2.2。检查服务模式应用

我打开ES文件浏览器&gt;应用经理。 连接手机,在手机/备份/应用程序我有servicestatus apk。 几分钟或逆向工程之后,我有了清单文件,就像它所使用的一样。在那里,我可以看到一堆活动,还有一些广播接收器。我不知道自己更害怕什么。

2.2.1让我们尝试一下这些活动。

由于我们知道我们可以从另一个开放特定的应用程序,我将尝试编写一个简单的应用程序,打开其中一个活动。这很简单:

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

由于此应用程序无意从启动器图标打开,因此它没有带有intent过滤器的活动,让我们知道它是主要活动。所以我必须尝试至少其中一些。但无论如何,我看到了一些我不喜欢的东西。我稍后会告诉你的。

我试过,但是,正如我所料,我无法打开那些活动。我得到一个未找到活动的例外。所以,让我们试试接收器吧。至少这会很有趣。

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";

看起来很棒,这是一个特定的意图,可能我们需要的架构不是&#34; tel:&#34;但是&#34; android_secret_code://&#34;可能代码必须采用不同的内部格式。 我尝试或多或少只是为了好玩,因为我知道我在活动中遇到了同样的问题,是这样的:

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

该应用声明了此权限,并且每个组件都使用它。所以,或者您知道如何声明和设置签名,或者您是一个系统应用程序。否则,您根本无法与此应用互动。

当然,您甚至无法考虑创建自己的服务模式应用,因为您不会在没有系统应用的情况下与提供商进行这种通信(因为您必须通过一些固件应用)那会说一个悲伤的&#34;你认为你是谁&#34;)

结论

在他看来我们无能为力,至少在三星手机上,我们可以认为其他所有手机都是一样的。

替代

嗯,实际上没有一个真的很好。但是让我们看看:

备选方案1.查找其他类型的代码

我们知道有两种USSD。当您拨打最后一个#时,操作会自动触发,另一个则需要您按下呼叫按钮。

如果您尝试使用第三方拨号程序,则可以看到

  • 当您拨打第一种类型的代码时,根本没有触发任何内容(只有固件拨号器可以触发它们)
  • 您可以使用其他类型(类型代码+按下通话)。我想这意味着这种代码风险较小,因为它不会改变设备中的任何内容,所以它们是允许的。
  • 当然,如果您键入第一种类型的代码并按下调用,则会出现错误,因为该代码无法正常工作。

因此,如果第三方可以发送该类型的代码,则每个应用都可以。 因此,如果您可以尝试查找替代的ussd代码,在用户按下呼叫按钮后触发的那种类型,您就可以实现所需。在这种情况下,您应该使用Intent.ACTION_CALL意图

//如果您使用ACTION_DIAL意图,它会打开拨号器并将给定的数字放入其中。 //同时,如果我们使用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 project page at coogle code中,有一项添加USSD API支持的请求。它有很多订阅者,但它已经很老了(超过5年),我担心它不是很好。 无论如何,这可能发生,可能是android tem会考虑准备一个api所以一个应用程序可以声明一些权限,并提出某种代码的请求。但是,我知道,这可以永远等待。

那么,该说些什么。愿运气寻找解决方案,或替代您的应用程序。对不起,我的研究并不富有成效:(

答案 1 :(得分:3)

我认为我得到了解决方案。

通过在root电话上运行波纹管代码,您应该打开Samsung ServiceModeApp(此帖子中显示的服务模式)。以编程方式,我认为如果以root身份登录,则可以运行任何内容。但是,还有一些问题需要面对:

  1. 扎根手机。如果您要创建要发布的应用,请考虑所有Android设备中只有不到2%的用户已植根;
  2. 非常具体的应用。这个波纹管代码在三星设备的特定版本中运行(我在Galaxy SIII GT-9300中运行它)。它可能无法在其他型号中运行,并且肯定不会在其他品牌中运行。您必须重新实施每个案例。
  3. 重申 0011 是您必须传递给活动的参数。代码如下:

    PackageManager packageManager = this.getPackageManager();
    if (packageManager != null) {
        measure_intent = new Intent(Intent.ACTION_MAIN).
                addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName(
                        "com.sec.android.app.servicemodeapp",
                        "com.sec.android.app.servicemodeapp.ServiceModeApp"));
        measure_intent.putExtra("keyString", "0011");
        ResolveInfo resolved = packageManager.resolveActivity(
                measure_intent, PackageManager.MATCH_DEFAULT_ONLY);
        if (resolved != null) {
            startActivity(measure_intent);
            return;
        } else {
            Toast.makeText(this, "version not implemented", Toast.LENGTH_LONG).show();
        }
    }
    

    我已经通过从Android&#s / system / app目录中提取ServiceModeApp,然后反编译.apk文件,然后分析其代码来实现它。希望能帮助到你! :)

答案 2 :(得分:0)

FWIW:ServiceMode(SM)访问依赖于HW和SW,并且每个制造商都试图在AOS API的每次迭代中重复隐藏SM功能。 SM实际上位于调制解调器FW中,你看到的只是Java包装器制作并呈现调制解调器RTOS的各种调用的结果。 (您可以检查您的调制解调器FW以查找您自己。)此外,最近的三星/ HTC库存FW,他们还需要启用/ efs /目录中的某些文件。

答案 3 :(得分:-1)

并不是真正的解决方法,但是使用Intent.ACTION_DIAL可以在拨号窗口中显示代码(哈希星哈希星4636星哈希星哈希),然后长按并剪切,然后长按并粘贴就可以了(在Moto G5s +)。对于我来说,从应用程序执行此操作比提供单独的拨号程序仍然更简单,但正如我所说的,并不是真正的解决方法。