دستگاههایی که Android نسخه ۱۰ یا بالاتر را اجرا میکنند، اهداف تماس را متفاوت از دستگاههایی که Android نسخه ۹ یا پایینتر را اجرا میکنند مدیریت میکنند. در Android 10 و بالاتر،
ACTION_NEW_OUTGOING_CALL
منسوخ شده است و با
CallRedirectionService
API جایگزین شده است. CallRedirectionService میاناهایی را برای شما فراهم میکند تا از آنها برای
اصلاح تماسهای خروجی برقرارشده توسط پلاتفرم Android استفاده کنید. برای مثال، برنامههای طرف سوم ممکن است تماسها را لغو کنند و آنها را ازطریق VoIP تغییر مسیر دهند.
کاتلین
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() } } } }
جاوا
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(); } } }
باید این سرویس را در مانیفست ثبت کنید تا سیستم بتواند آن را بهدرستی راهاندازی کند.
<service
android:name=".RedirectionService"
android:permission="android.permission.BIND_CALL_REDIRECTION_SERVICE">
<intent-filter>
<action android:name="android.telecom.CallRedirectionService"/>
</intent-filter>
</service>
برای استفاده از سرویس هدایت، برنامهتان باید نقش هدایت تماس را از
RoleManager درخواست کند. این کار از کاربر میپرسد که آیا میخواهد به برنامه شما اجازه دهد تغییر مسیر تماس را مدیریت کند. اگر این نقش به برنامهتان اعطا نشود، از سرویس تغییر مسیر شما استفاده نمیشود.
وقتی کاربر برنامهتان را راهاندازی میکند، باید بررسی کنید که آیا برنامهتان این نقش را دارد یا نه تا
بتوانید درصورت نیاز آن را درخواست کنید. قصدی را که توسط RoleManager ایجاد شده است راهاندازی میکنید،
بنابراین مطمئن شوید که تابع
onActivityResult()
را لغو میکنید تا انتخاب کاربر را مدیریت کنید.
کاتلین
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 } }
جاوا
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); } } } }