安卓拨号应用程序

32

我正在寻找一种方法,将默认的拨号应用程序替换为我的自定义拨号应用程序,但我不知道如何实现。

这是我的要求:

  • 创建自定义拨号UI
  • 每当按下硬件上的通话按钮或Android上的通话按钮时,都会调用我的应用程序
  • 该应用程序还可以从联系人屏幕中调用

我所指的是public static final String ACTION_DIAL


在这里,您可以找到一个自定义拨号器:https://github.com/Ali-Rezaei/PadLayout - Ali
4个回答

48
  1. 创建一个简单的Android应用程序(我们的拨号器)。 要实际呼叫某人,您只需要该方法:

private void performDial(String numberString) {
    if (!numberString.equals("")) {
       Uri number = Uri.parse("tel:" + numberString);
       Intent dial = new Intent(Intent.ACTION_CALL, number);
       startActivity(dial);
    }
}
  • 在AndroidManifest中授予您的应用程序调用权限

  • <uses-permission android:name="android.permission.CALL_PHONE" />
    
  • 在 AndroidManifest 中设置意图,告诉你的手机在需要拨号器时使用你的应用程序

  • 当有人点击拨打按钮时:

        <intent-filter>
            <action android:name="android.intent.action.CALL_BUTTON" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    
    当某人触发一个URI时:
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <action android:name="android.intent.action.DIAL" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="tel" />
        </intent-filter>
    

    3
    如果你的手机界面(例如HTC Sense)启动自己的拨号器而不是Fire拨号器活动,则你实际上无能为力... - zirael
    1
    你不能这样做。至少就我所知,是不行的。 - zirael
    1
    如果您查看联系人应用程序代码,您将看到android.intent.action.CALL_PRIVILEGED被使用。还请参考https://dev59.com/k1LTa4cB1Zd3GeqPYTiu。 - Vamsi
    当从第三方联系人应用程序拨打电话时,我需要执行action.CALL而不是action.DIAL,以便我的应用程序出现在列表中。但是,即使使用默认联系人列表或最近的通话列表拨打号码,这也无法正常工作。如果我使用CALL_PRIVILEGED,则一切正常(这就是Skype所做的)。然而,令我困惑的是,Google的一篇博客文章强烈反对使用CALL_PRIVILEGED。但是,我看不到其他方法。博客文章链接:http://android-developers.blogspot.com/2013/05/handling-phone-call-requests-right-way.html - gdw2
    如果您想创建自己的拨号应用程序,那么这并不起作用。这只是将您的呼叫重定向到本机/可用的应用程序。有什么办法可以将您的应用程序标记为拨号应用程序吗?CALL_PRIVILEGED似乎是一个选择,但也不起作用!!有什么建议! - CoDe
    显示剩余6条评论

    7
    这对我有用:

    这对我有用:

            <activity
            android:name=".activities.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    
            <!-- open activity when establishing a call -->
            <intent-filter>
                <action android:name="android.intent.action.CALL_PRIVILEGED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="tel" />
            </intent-filter>
    
        </activity>
    

    1
    正如我在另一个答案下评论的那样,这对我有效。不过,我认为谷歌最近在博客文章中不鼓励使用此意图,这有点奇怪:http://android-developers.blogspot.com/2013/05/handling-phone-call-requests-right-way.html 。如果我按照他们的建议使用NEW_OUTGOING_CALL,当从联系人应用程序拨打电话时,我的应用程序将不会与其他应用程序(例如Skype)一起显示为呼叫选项。此外,他们声称CALL_PRIVILEGED仅适用于系统应用程序。 - gdw2

    3

    请参考这个回答,作者是arekolek

    这是第三方应用正确扩展InCallService的方法,该应用将在用户接受启动提示后替换系统默认的拨号器和InCallScreen。

    他还提供了一个使用Kotlin编写的可工作示例应用程序(加分项)。

    请在那里点赞他的答案,我不应得他的功劳。

    注意:仅适用于API 23+,并且可能需要API 26中的额外权限


    2

    是的,我想创建一个自定义拨号器,我已经尝试使用android.intent.action.CALL_BUTTON,但它对我没有起作用。 - ingsaurabh
    Saurabh,你解决了这个问题吗?分享解决方案,让社区受益。 - Roll no1
    如果你找到了解决方案,请分享答案。 - Basher51
    我成功地在原生拨号应用程序上叠加了一个视图。更多信息请参见:https://dev59.com/xn_aa4cB1Zd3GeqP7cJz#24377603 - Basher51

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