这里是我提出的一个解决方案,可以在电话拨打后短暂隐藏呼叫应用程序。我认为除了重写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)
{
return null;
}
}
考虑到SDK的限制,我认为不可能提供一个更简洁的解决方案。