为了成为默认的电话应用程序,必须InCallService与meta-data清单中的标记以及使用CALL_PHONE许可一起实施。
到目前为止我做了什么:
Manifest.xml
<uses-permission android:name="android.permission.CALL_PHONE" />
<service
            android:name=".InCallServiceImplementation"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.BIND_INCALL_SERVICE">
            <meta-data
                android:name="android.telecom.IN_CALL_SERVICE_UI"
                android:value="true" />
            <meta-data
                android:name="android.telecom.IN_CALL_SERVICE_RINGING"
                android:value="true" />
            <intent-filter>
                <action android:name="android.telecom.InCallService" />
            </intent-filter>
 </service>
 
被要求为默认值,用户也授予了CALL_PHONE权限。下面是我的InCallServiceImplementation.java,它扩展了InCallService
@Override
   public void onCallAdded(Call call)
   {
       super.onCallAdded(call);
       Log.d("InCallService :", "Added a new call.. \n");
       new OngoingCall().setCall(call);
       Log.d("InCallService :", "FOUND DIRECTION FOR INCOMING :" + IsInComingCall + ".. \n");
       if (IsInComingCall)
       {
           // START ACTIVITY FOR INCOMING CALL
           //IncomingCallActivity.start(this, call);
       }
       else
       {
           // START ACTIVITY FOR OUTGOING CALL
           //DialerActivity.start(this, call);
       }
   }
   @Override
   public void onCallRemoved(Call call)
   {
       super.onCallRemoved(call);
       Log.d("InCallService :", "Call is removed.. \n");
       new OngoingCall().setCall(null);
   }
 
下面是我的OngoingCall.java类
private Object callback = new Call.Callback() 
 
{
      @Override
      public void onStateChanged(Call call, int newState) {
          super.onStateChanged(call, newState);
          state.onNext(newState);
      }
  };
  public final void setCall(@Nullable Call value) 
  {
      if (call != null) 
      {
          call.unregisterCallback((Call.Callback)callback);
      }
      if (value != null) 
      {
          value.registerCallback((Call.Callback)callback);
          state.onNext(value.getState());
      }
      call = value;
  }
  public void answer() 
  {
      assert call != null;
      call.answer(VideoProfile.STATE_AUDIO_ONLY);
  }
  public void hangup() 
  {
      assert call != null;
      call.disconnect();
  }
 
工作方式: 如果我通过“我的应用”拨打电话或拨打电话,或者即使从制造商的电话应用中拨打电话,DialerActivity如果将if-else其从功能中删除,它也会启动我onCallAdded
那是什么问题呢:
即使有来电,它仍会显示正在DialerActivity显示拨出电话的画面。我有2个不同的来电和去电活动。
我正在寻找什么分辨率:
我如何找到呼叫是呼入还是呼出,呼叫方向。因此可以向用户呈现适当的布局。
在学习或搜索方面做了哪些努力:
我总是很难理解Google文档的用途是什么?
在[Call.Details] [1]上找到它
[1]:https : //developer.android.com/reference/android/telecom/Call.Details.html#getCallDirection()可以获取方向。我进行了很多搜索,然后再次发现[构建通话应用] [1]
[1]:https://developer.android.com/guide/topics/connectivity/telecom/selfManaged,其中介绍了许多实现方法。只是一些概述和一些不完整的示例,带有许多理论。我找到了[简易电话] [1]
[1]:https://github.com/arekolek/simple-phone,但它是在kotlin中开发的。同一项目在Java中名为[Custom Phone Dialer] [1]
[1]:https : //github.com/Abror96/CustomPhoneDialer 尚未实现此指令。我也没有从Google文档中找到任何适当的分步指南。如果开发人员尝试阅读其示例程序,则会丢失许多变量和函数,这对于阅读无用,并且花费大量时间进行研究。
提前谢谢大家
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。