安卓手机应用:保持关注于呼入和呼出电话的电话应用程序

3
使用这个简单的例子创建一个电话呼叫应用程序,拨出一个硬编码 # 并监视电话状态。

http://www.mkyong.com/android/how-to-make-a-phone-call-in-android/

很不幸,在打电话时,我们总是会切换到实际的内置电话应用程序。

我想避免这种情况,或者至少隐藏拨号键盘按钮。用户不应该有输入电话号码的选项。

有人知道如何实现这一点吗? 即使保持实际内置电话应用程序在后台 (我需要在主要应用程序中添加扬声器和结束通话按钮)

或者

作为替代方案,仅隐藏本机内置电话应用程序中的拨号键盘按钮?

2个回答

1
这里是我提出的一个解决方案,可以在电话拨打后短暂隐藏呼叫应用程序。我认为除了重写Android系统外,没有办法使其完全透明。我认为可以通过检测呼叫应用程序的设置并拨打电话来改进此方法,而不是使用可能不可靠的postDelayed()
编辑:我尝试制作一个接收器来监听NEW_OUTGOING_CALL以重新启动原始活动,但它并没有真正改善任何东西,拨号应用程序必须在任意时间运行一段时间,然后才能启动其后台服务。
编辑:我尝试制作一个PhoneStateListener来监听CALL_STATE_OFFHOOK并在那里重新启动Activity。这也行不通,因为它发生在拨号应用程序完全准备好进入后台之前。
编辑:您可以查看此线程:Reflection to access advanced telephony features,但我认为Google已经锁定了所有在标准应用程序之外进行呼叫的方法。
此解决方案将开始拨号,然后在几秒钟后切换回原始活动。
在我的清单文件中,我有以下内容:
android:launchMode="singleInstance"

在我的 Activity 上,这样我就不会得到一个新的实例。
public class MainActivity extends Activity
{
  ....
    public void clickMe(View view)
    {
        startService(new Intent(this, PhoneService.class));
    }
}


public class PhoneService extends Service
{
    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        Intent call = new Intent(Intent.ACTION_CALL);
        call.setData(Uri.parse("tel:XXXXXXXXX"));
        call.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(call);

        Handler h = new Handler();
        h.postDelayed(new Runnable() {

            @Override
            public void run()
            {
                Intent act = new Intent(PhoneService.this, MainActivity.class);
                act.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(act);
            }

        }, 4000);

        return super.onStartCommand(intent, flags, startId);


    }

    @Override
    public IBinder onBind(Intent arg0)
    {
        // TODO Auto-generated method stub
        return null;
    }

}

考虑到SDK的限制,我认为不可能提供一个更简洁的解决方案。


关于来电怎么办?有没有一种方法让自定义应用程序不失去焦点?谢谢。 - user2005121
你可以使用PhoneStateListener监听TelephonyManager.CALL_STATE_RINGING(带上你的号码),然后在第一次响铃后的一定时间内,如果TelephoneManager.CALL_STATE_OFFHOOK发生,则启动你的应用程序。用户必须从正常的电话应用程序中接听电话。 - Steve M

1
您想要的功能没有可能实现,除非进行某种hack-ish绕过。Android系统只允许电话应用程序控制底层的RIL和电话堆栈,并且电话应用程序UI通过呈现拨号URI将用户呈现在拨号屏幕上,在那里他们必须确认(或更改)号码。这是一种安全措施,以防止未经用户同意的应用程序使用电话设备。此外,由于Android中Intent系统的工作方式,其他应用程序可以使用SIP或其他VoIP功能处理电话呼叫(例如Skype)。在这种情况下,用户可能已经设置了全局首选项,始终使用其他应用程序,并且您无法控制该应用程序如何处理拨号Intent。

至少在我的手机上,使用Intent.ACTION_CALL将立即拨打电话,而不给用户更改或确认的机会。但它确实将电话应用程序带到前台,并提供挂断等选项。 - Steve M
ACTION_CALL动作会立即拨打电话;然而,平台实现对其进行了限制,只允许特定的应用程序使用。您的应用程序必须具有CALL_PHONE权限。即使如此,如果有多个应用程序在其清单中声明可以处理此意图,用户仍然可能会收到提示。 - Larry Schiefer
好主意,Skype可以作为处理意图的选项呈现。 - Steve M

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