โอนสาย

อุปกรณ์ที่ใช้ Android 10 ขึ้นไปจะจัดการ Intent การโทรแตกต่างจาก อุปกรณ์ที่ใช้ Android 9 หรือต่ำกว่า ใน Android 10 ขึ้นไป ACTION_NEW_OUTGOING_CALL เลิกใช้งานการออกอากาศแล้ว และแทนที่ด้วย CallRedirectionService API CallRedirectionService มีอินเทอร์เฟซให้คุณใช้เพื่อ แก้ไขสายโทรออกที่โทรออกโดยแพลตฟอร์ม Android เช่น บุคคลที่สาม แอปอาจยกเลิกการโทรและเปลี่ยนเส้นทางผ่าน VoIP

Kotlin

class RedirectionService : CallRedirectionService() {
    override fun onPlaceCall(
        handle: Uri,
        initialPhoneAccount: PhoneAccountHandle,
        allowInteractiveResponse: Boolean
    ) {
        // Determine if the call should proceed, be redirected, or cancelled.
        val callShouldProceed = true
        val callShouldRedirect = false
        when {
            callShouldProceed -> {
                placeCallUnmodified()
            }
            callShouldRedirect -> {
                // Update the URI to point to a different phone number or modify the
                // PhoneAccountHandle and redirect.
                redirectCall(handle, initialPhoneAccount, true)
            }
            else -> {
                cancelCall()
            }
        }
    }
}

Java

class RedirectionService extends CallRedirectionService {
    @Override
    public void onPlaceCall(
            @NonNull Uri handle,
            @NonNull PhoneAccountHandle initialPhoneAccount,
            boolean allowInteractiveResponse
    ) {
        // Determine if the call should proceed, be redirected, or cancelled.
        // Your app should implement this logic to determine the redirection.
        boolean callShouldProceed = true;
        boolean callShouldRedirect = false;
        if (callShouldProceed) {
            placeCallUnmodified();
        } else if (callShouldRedirect) {
            // Update the URI to point to a different phone number or modify the
            // PhoneAccountHandle and redirect.
            redirectCall(handle, initialPhoneAccount, true);
        } else {
            cancelCall();
        }
    }
}

คุณต้องลงทะเบียนบริการนี้ในไฟล์ Manifest เพื่อให้ระบบสามารถเริ่มทำงานได้ อย่างถูกต้อง

<service
    android:name=".RedirectionService"
    android:permission="android.permission.BIND_CALL_REDIRECTION_SERVICE">
    <intent-filter>
        <action android:name="android.telecom.CallRedirectionService"/>
    </intent-filter>
</service>

หากต้องการใช้บริการเปลี่ยนเส้นทาง แอปของคุณต้องขอบทบาทการเปลี่ยนเส้นทางการโทร จาก RoleManager การดำเนินการนี้จะถาม ผู้ใช้หากต้องการอนุญาตให้แอปจัดการการเปลี่ยนเส้นทางการโทร หากแอปของคุณ ไม่ได้รับบทบาทนี้ ระบบจะไม่ใช้บริการเปลี่ยนเส้นทางของคุณ

คุณควรตรวจสอบว่าแอปมีบทบาทนี้หรือไม่เมื่อผู้ใช้เปิดแอป คุณสามารถส่งคำขอได้ทุกเมื่อตามต้องการ คุณเปิด Intent ที่สร้างโดย RoleManager ดังนั้นอย่าลืมลบล้าง onActivityResult() จัดการการเลือกของผู้ใช้

Kotlin

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Tell the system that you want your app to handle call redirects. This
        // is done by using the RoleManager to register your app to handle redirects.
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
            val roleManager = getSystemService(Context.ROLE_SERVICE) as RoleManager
            // Check if the app needs to register call redirection role.
            val shouldRequestRole = roleManager.isRoleAvailable(RoleManager.ROLE_CALL_REDIRECTION) &&
                    !roleManager.isRoleHeld(RoleManager.ROLE_CALL_REDIRECTION)
            if (shouldRequestRole) {
                val intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_REDIRECTION)
                startActivityForResult(intent, REDIRECT_ROLE_REQUEST_CODE)
            }
        }
    }

    companion object {
        private const val REDIRECT_ROLE_REQUEST_CODE = 1
    }
}

Java

class MainActivity extends AppCompatActivity {
    private static final int REDIRECT_ROLE_REQUEST_CODE = 0;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Tell the system that you want your app to handle call redirects. This
        // is done by using the RoleManager to register your app to handle redirects.
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
            RoleManager roleManager = (RoleManager) getSystemService(Context.ROLE_SERVICE);
            // Check if the app needs to register call redirection role.
            boolean shouldRequestRole = roleManager.isRoleAvailable(RoleManager.ROLE_CALL_REDIRECTION) &&
                    !roleManager.isRoleHeld(RoleManager.ROLE_CALL_REDIRECTION);
            if (shouldRequestRole) {
                Intent intent = roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_REDIRECTION);
                startActivityForResult(intent, REDIRECT_ROLE_REQUEST_CODE);
            }
        }
    }
}