如何将我的应用程序添加到Android默认拨号器选择?

时间:2013-05-16 12:08:40

标签: android android-intent phone-call

我的问题是如何将我的应用程序添加到Android默认拨号器选择中,更具体而不使用android.intent.action.CALL_PRIVILEGED?

现在我使用下面的代码,这很好用:

<intent-filter>
    <action android:name="android.intent.action.CALL_PRIVILEGED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="tel" />
</intent-filter>

然而谷歌最近发布了:http://productforums.google.com/forum/#!topic/mobile/wXqnbynsL8Y

并将其邮寄给使用意图android.intent.action.CALL_PRIVILEGED的程序:

  

问题:   您的应用程序的用户可能无法进行紧急情况   如果他们选择了,可以通过系统电话拨号器拨打电话   你的申请路线电话。如文档中所述,   侦听CALL_PRIVILEGED Intent操作的应用程序将会   从系统拦截紧急服务电话,但可能无法   正确地路由它们。请注意,CALL_PRIVILEGED是一个   受限API,不适用于第三方应用程序   无法正确拨打紧急电话。

     

解决方案:
  •从Java代码和AndroidManifest.xml中的Intent过滤器中删除CALL_PRIVILEGED。   •更新您的Google Play列表   说明包含使用您的应用作为默认值的声明   拨号器可能会干扰拨打911紧急服务。

我要删除的最简单的解决方案,但应用程序将使用功能。但是有另一种方法将应用程序添加到默认的拨号器选择中吗?但是没有CALL_PRIVILEGED意图吗?

提前致谢

default dialer selection

只是默认拨号器选择的一个示例

编辑:

我使用的其他意图:

 <intent-filter>
            <action android:name="android.intent.action.CALL_BUTTON" />
                <category android:name="android.intent.category.DEFAULT" />
                 <data android:scheme="tel"/>
            </intent-filter>

             <intent-filter>
                <action android:name="android.intent.action.DIAL" />
                <category android:name="android.intent.category.DEFAULT" />
                 <data android:scheme="tel"/>
            </intent-filter>

3 个答案:

答案 0 :(得分:3)

         <intent-filter>
            <action android:name="android.intent.action.CALL_PRIVILEGED" />                
            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="tel" />
         </intent-filter>

更重要的是,在意图过滤器中需要特权调用操作,数据为uri的“tel”。 以下权限标记也需要允许拨打电话。 在类别Launcher中的代码中丢失。

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

答案 1 :(得分:1)

您无需拦截CALL_PRIVILEGED即可制作拨号程序。有3种意图:

ACTION_DIAL:调用拨号器。你应该拦截这个。

CALL:拨打电话。如果您通过VoIP路由呼叫,我想您需要拦截此情况,否则只需将其传递给系统。

CALL_PRIVILEGED:发出紧急电话(美国911等)。你不需要拦截这个,因为即使没有SIM卡,这些呼叫也是专门路由的,而且不会向用户收费。

对于它的价值,我从谷歌收到了同样的电子邮件。 My app甚至不使用CALL或CALL_PRIVILEGED意图。但是,在代码中检查传递的意图不是此操作(仅为了完整性)。所以,我认为他们只是扫描apk的数据部分,看看这个字符串是否在任何地方使用。

编辑试试这个,它适用于我的应用:

    <activity android:name=".ActivityName"
              android:label="@string/activity_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.DIAL" />
            <action android:name="android.intent.action.CALL_BUTTON" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity-alias android:targetActivity="fully.qualified.ActivityName"
                    android:name="fully.qualified.ActivityName_HTC_hack"
                    android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.DIAL" />
            <data android:scheme="tel" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>
    </activity-alias>

答案 2 :(得分:0)

尝试“android.intent.action.DIAL”。用户必须手动启动呼叫,但我认为这是最佳解决方案。

  

输入:如果没有,则启动空拨号器; else getData()是要拨打的电话号码的URI或显式电话号码的tel:URI。   ref: developer page