Android-电话应用程序,专注于传出和;来电

时间:2013-12-28 16:11:09

标签: android focus telephonymanager

使用这个简单示例创建一个拨打硬编码#并监控手机状态的PhoneCall应用程序。

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

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

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

有谁知道实现这个目标的方法? 即将实际的内置电话应用程序保留在后台 (我需要为扬声器添加按钮,并在主应用程序中结束通话)

OR

或者,只隐藏原生内置手机应用程序中的拨号盘按钮?

2 个答案:

答案 0 :(得分:1)

这是我提出的一个解决方案,可以在通话结束后立即隐藏来电应用。如果不重新编写Android系统,我不相信有办法让它完全透明。我相信这可以通过检测呼叫者应用程序何时设置和拨号而不是我使用的postDelayed()来改善,这可能是不可靠的。

编辑:我试图使一个接收器监听NEW_OUTGOING_CALL重新启动原来的活动,但它并没有真正改善什么,拨号器应用程序必须运行的任意时间量,才可以启动它的后台服务。

编辑:我尝试制作一个PhoneStateListener来监听CALL_STATE_OFFHOOK并重新启动那里的活动。这不会在拨号应用程序完全准备好进入后台之前发生。

编辑:你可以看看这个主题:Reflection to access advanced telephony features,但我相信谷歌已经锁定了在标准应用之外拨打电话的所有方法。

此解决方案将开始拨号,然后在几秒钟后切换回原始活动。

在我的清单中我有:

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的限制,我认为无法提供更清晰的解决方案。

答案 1 :(得分:1)

如果没有某种类型的黑客攻击,那么你想要的功能是不可能的。 Android系统仅允许Phone应用程序控制底层RIL和电话堆栈,并且Phone app UI响应拨号URI,向用户显示拨号屏幕,他们必须在此确认(或更改)号码。这是一种安全措施,可防止不需要的应用程序在用户不知情的情况下使用电话设备。此外,由于Intent系统在Android中的工作方式,其他应用程序可以使用SIP或其他VoIP功能(即Skype)处理呼叫。在这种情况下,用户可能已设置全局首选项以始终使用其他应用程序,并且您无法控制该应用程序与拨号Intent的行为方式。