簡體   English   中英

如果將我的應用程序選擇為默認的Dialer App。 是否有可能在Dialer中顯示呼叫

[英]If my app is selected as the default Dialer App. Is it possible to make intent to show call in the Dialer

我已經實現了清單中的CallService,如下所示:

 <service
        android:name=".dialer.CallService"
        android:permission="android.permission.BIND_INCALL_SERVICE">
        <meta-data
            android:name="android.telecom.IN_CALL_SERVICE_UI"
            android:value="true"/>

        <intent-filter>
            <action android:name="android.telecom.InCallService"/>
        </intent-filter>
    </service>

就是這樣:

@TargetApi(Build.VERSION_CODES.M)
class CallService : InCallService() {

companion object {
    private const val LOG_TAG = "CallService"
}

override fun onCallAdded(call: Call) {
    super.onCallAdded(call)
    App.GSMCALL = true;
    Log.i(LOG_TAG, "onCallAdded: $call")
    Log.i(LOG_TAG, "onCallAdded: ${call.details.handle.schemeSpecificPart}")
    call.registerCallback(callCallback)
    val intent = Intent(this, IncomingCallActivity::class.java)
    if (call.details.handle.schemeSpecificPart.contains("<INSERT PHONE NR HERE>")) { // something similar will be done, if I don't pass new_task it will go through default caller
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    }
    startActivity(intent)
    CallManager.updateCall(call)
}

override fun onCallRemoved(call: Call) {
    super.onCallRemoved(call)
    App.GSMCALL = false;
    Log.i(LOG_TAG, "onCallRemoved: $call")
    call.unregisterCallback(callCallback)
    CallManager.updateCall(null)
}

private val callCallback = object : Call.Callback() {
    override fun onStateChanged(call: Call, state: Int) {
        Log.i(LOG_TAG, "Call.Callback onStateChanged: $call, state: $state")
        CallManager.updateCall(call)
    }
}

}

現在這就是我想要的。 如果我的電話是,那么我希望它進行我的通話活動。 但是,如果它是一個不同的電話號碼,我希望它回落到電話撥號程序中。 這可能嗎? 我已經看到,如果不添加FLAG_ACTIVITY_NEW_TASK,它將崩潰,從而使電話主Dialer出現。 但這只能工作一次,而且我不會使用這種技巧來使其工作。 還有其他想法嗎?

編輯:

我正在將Google Pixel與Android Pie配合使用

我嘗試實現@marmor建議的邏輯,但仍然無法正常工作。

這是我在create上的活動:

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    wakeUpDeviceWhenWindowShown()
    setTheme(R.style.AppTheme)
    var params = WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            if (VERSION.SDK_INT >= VERSION_CODES.O) WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY else WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or FLAG_SHOW_WHEN_LOCKED or FLAG_DISMISS_KEYGUARD, ActivityInfo.COLOR_MODE_DEFAULT)
    setContentView(R.layout.activity_call)
    val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
    wm.addView(window.decorView, params)
}

我在AndroidManifest中添加了以下代碼: <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>並具有以下代碼:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    {
        if (!Settings.canDrawOverlays(this))
        {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, 0);
        }
    }

這是我得到的錯誤:

2019-07-23 13:13:06.600 18418-18418/com.xelion.android.debug E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xelion.android.debug, PID: 18418
java.lang.IllegalStateException: View DecorView@53d8f92[IncomingCallActivity] has already been added to the window manager.
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:328)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3906)
    at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6718)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我也試着做:

    window.setType(if (VERSION.SDK_INT >= VERSION_CODES.O) WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY else WindowManager.LayoutParams.TYPE_SYSTEM_ERROR)
    window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or FLAG_SHOW_WHEN_LOCKED or FLAG_DISMISS_KEYGUARD)

不做wm.addView(window.decorView, params)

但是我得到的是:我做錯了什么? 在此處輸入圖片說明

好的,就像在評論中一樣,我建議您監聽傳入的呼叫事件,如果特定的呼叫正在進入,則將您的UI置於系統通話中UI之上。

監聽來電: https : //developer.android.com/reference/android/telephony/PhoneStateListener 添加PhoneStateListener

顯示始終顯示在頂部的視圖: 如何在Android中創建始終顯示在頂部的全屏疊加活動

要使用的WindowManager.LayoutParams:

WindowManager.LayoutParams(
    LayoutParams.WRAP_CONTENT,
    LayoutParams.WRAP_CONTENT,
    VERSION.SDK_INT >= VERSION_CODES.O ? LayoutParams.TYPE_APPLICATION_OVERLAY : LayoutParams.TYPE_SYSTEM_ERROR,
    LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_SHOW_WHEN_LOCKED | LayoutParams.FLAG_DISMISS_KEYGUARD);

編輯:

您發布的代碼試圖使“活動”顯示在來電屏幕的頂部,相反,您應該創建一個視圖並將其作為警報視圖添加到windowManager中。 即代替:

setContentView(R.layout.activity_call)
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
wm.addView(window.decorView, params)

嘗試執行以下操作(未經測試的代碼):

View view = LayoutInflater.from(this).inflate(R.layout.activity_call)
val wm = getSystemService(Context.WINDOW_SERVICE) as WindowManager
wm.addView(view, params)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM