【问题标题】:Replace native outgoing call Screen by custom screen android用自定义屏幕android替换本机呼出屏幕
【发布时间】:2013-10-07 04:39:21
【问题描述】:

我正在尝试在本地拨出呼叫者屏幕顶部启动我的自定义屏幕,该屏幕可能包含呼叫者的全屏图像和一些用于拒绝呼叫等操作的按钮。使用它我可以拨打电话,但会将我重定向到本机呼叫者屏幕...

如何通过我的自定义屏幕屏幕replace\override默认呼叫屏幕?

startActivity(new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phonenumber)));
public class GetOutgoingNUmber extends BroadcastReceiver {


final static String INTENT_PHONE_NUMBER = "android.intent.extra.PHONE_NUMBER";

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Log.v("DileBroadCastReceiver","In onReceive()");

    if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {

         new Handler().postDelayed(new Runnable() {
             @Override
             public void run() {
                 Intent i = new Intent(context, OutGoingScreen.class);
                i.putExtras(intent);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                context.startActivity(i);
             }
         }, 1000);
}

这里的 OutGoingScreen 用于显示输出屏幕

  public class OutGoingScreen extends Activity {
 @Override
    protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.outgoingscreen );

    }
}

现在的问题是它显示我的屏幕几毫秒,然后再次显示本机屏幕....?

【问题讨论】:

    标签: android


    【解决方案1】:

    为拨出电话编写接收器

    public class OutgoingCallReceiver extends BroadcastReceiver {
    @Override
        public void onReceive(final Context context, final Intent intent) {
          //Write intent for yout page
      }
    }
    

    将这些添加到清单中

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    
    <receiver android:name=.OutgoingCallReceiver" >
       <intent-filter>
          <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
       </intent-filter>
     </receiver>
    

    将以下主题添加到活动主题中

    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
    

    在 1 秒后打开您的意图,因为原来的拨出呼叫屏幕需要 800 毫秒才能打开,因此您需要覆盖该屏幕,因此您必须在 800 毫秒后调用意图。 它对我有用。

    【讨论】:

    • 我已经相应地编辑了我的代码。谢谢。但仍然没有得到我的屏幕。
    • 如何延迟呢?我应该使用 Handler postDelayed() 方法使用 Runnable 吗....
    • 在其中添加延迟后,它仍然给出了一些问题..我已经更新了我的问题
    • 将延迟增加到 2 毫秒并尝试.. 在模拟器中很难在设备中实现尝试,在设备中它将工作 1000 毫秒
    • 这听起来像一个肮脏的黑客,我不会依赖这段代码在所有可能的设备上工作。如果设备打开原生手机屏幕的时间超过 800 毫秒怎么办?
    【解决方案2】:

    这样做的最佳方式是开发您自己的电话应用程序,并期望用户将其设置为拨打电话的默认应用程序。

    编辑:

    添加一个接受 ACTION_DIAL 意图并具有数字键盘的 Activity,然后一旦用户输入电话号码,您就可以使用电话号码触发 ACTION_CALL 意图,这将调用本机电话应用程序。这样,用户也必须选择您的应用作为 ACTION_DIAL 意图的默认应用。

    【讨论】:

    • 感谢您的回复。但实际上我已经完成了我的整个应用程序,现在我剩下的就是获得自定义传出屏幕,所以只有创建整个手机应用程序对我来说会非常耗时。还有其他选择吗?再次感谢您的建议。
    • 你想让那个屏幕做什么?打电话?
    【解决方案3】:

    您无需创建单独的应用程序。 最终你只想处理新的呼出请求,所以创建一个BroadcastReceiver 来监听ACTION_NEW_OUTGOING_CALL 的事件,并创建一个Activity 来调用该事件。

    您需要在清单文件中指定有关PROCESS_OUTGOING_CALLS 的权限。

    看看一些参考文献

    handling-phone-call-requests-right-way

    android-dialer-application

    希望对你有帮助!

    【讨论】:

    • 我已经相应地编辑了我的代码。谢谢。但仍然没有得到我的屏幕。
    • 感谢您的回复,我已经更新了我的问题...您能帮我解决这个问题吗..
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多