Как привязать CallScreeningService?

Я хочу получить информацию о звонках и заблокировать звонки (при необходимости). Поскольку метод endCall TelecomManager устарел и согласно документации предлагается использовать CallScreeningService. https://developer.android.com/reference/android/telecom/CallScreeningService.html

Как упоминалось в документации Android, я пытаюсь связать CallScreeningService со своим приложением.

Я создал класс

    public class CallUtil extends CallScreeningService {
      private Call.Details mDetails;
      private static CallScreeningUtil sCallScreeningUtil;

      @Override
      public void onScreenCall(Call.Details callDetails) {
        CallResponse.Builder response = new CallResponse.Builder();
        Log.e("CallBouncer", "Call screening service triggered");

        sCallScreeningUtil = this;
        mDetails = callDetails;
        respondToCall(callDetails, response.build() );
    }
}

Это системное приложение, и я добавил необходимые разрешения в AndroidManifest.xml, такие как CALL_PHONE, MODIFY_PHONE_STATE, CALL_PHONE, ANSWER_PHONE_CALLS.

Я также добавил информацию об услуге, как показано ниже,

 <service android:name=".CallUtil"
          android:permission="android.permission.BIND_SCREENING_SERVICE">
      <intent-filter>
          <action android:name="android.telecom.CallScreeningService"/>
      </intent-filter>
 </service>

Я немного не понимаю, как связать эту службу с моей деятельностью или как связать эту службу с моим приложением, которое будет вызывать переопределенные методы в CallUtil.


comment
Поскольку это системное приложение, сообщите нам, какой уровень Android API используется на вашем устройстве. Голосуйте за информацию об устаревании. Означает ли это, что он больше не будет работать, или просто рекомендует не использовать его больше?   -  person Sina    schedule 29.07.2019


Ответы (3)


На основании документации, представленной здесь https://android.googlesource.com/platform/frameworks/base/+/9e1d4f86ba43e87264aba178f2bb037a3c3b26fb/telecomm/java/android/telecom/CallScreeningService.java

    Intent mCallServiceIntent = new Intent(this,"android.telecom.CallScreeningService");
        ServiceConnection mServiceConnection = new ServiceConnection(){

            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                // iBinder is an instance of CallScreeningService.CallScreenBinder
                // CallScreenBinder is an inner class present inside CallScreenService
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {

            }

            @Override
            public void onBindingDied(ComponentName name) {

            }
        }

И из активности для привязки к службе вы можете использовать

bindService(mCallServiceIntent, mServiceConnection, Context.BIND_AUTO_CREATE)
person Dinesh    schedule 12.07.2019

Вы запросили, чтобы он выполнял роль проверки вызовов??

Пробовали ли вы что-то подобное, как указано в документах Android... ?

public void requestRole() {
     RoleManager roleManager = (RoleManager) getSystemService(ROLE_SERVICE);
     Intent intent = roleManager.createRequestRoleIntent("android.app.role.CALL_SCREENING");
     startActivityForResult(intent, REQUEST_ID);
 }

 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == REQUEST_ID) {
         if (resultCode == android.app.Activity.RESULT_OK) {
             // Your app is now the call screening app
         } else {
             // Your app is not the call screening app
         }
     }
 }
person Naitik Soni    schedule 01.08.2019
comment
для меня это не найти ROLE_SERVICE - person user8462556; 04.11.2020
comment
Вы можете попробовать использовать роль напрямую в качестве аргумента @user8462556 и убедиться, что ваша текущая версия SDK = 29 - person Naitik Soni; 05.11.2020
comment
@Natik Soni: спасибо, теперь все работает. Возможно, у вас также есть представление об этом stackoverflow.com/questions/64693996/ - person user8462556; 05.11.2020

Вот самая простая реализация (основанная на примере репозитория здесь, проще здесь, если кто-то хочет проверить):

Основное действие

@RequiresApi(Build.VERSION_CODES.Q)
class MainActivity : AppCompatActivity() {
    private val roleManager by lazy { getSystemService(RoleManager::class.java) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        when {
            roleManager.isRoleHeld(RoleManager.ROLE_CALL_SCREENING) ->
                Log.d("AppLog", "got role")
            roleManager.isRoleAvailable(RoleManager.ROLE_CALL_SCREENING) ->
                Log.d("AppLog", "cannot hold role")
            else ->
                startActivityForResult(roleManager.createRequestRoleIntent(RoleManager.ROLE_CALL_SCREENING), REQUEST_CALLER_ID_APP)
        }
    }

//TODO handle onActivityResult if you wish. This is just the basic stuff...

    companion object {
        private const val REQUEST_CALLER_ID_APP = 1
    }
}

Базовая служба проверки звонков

@RequiresApi(Build.VERSION_CODES.Q)
class BasicCallScreeningService : CallScreeningService() {
    override fun onScreenCall(callDetails: Call.Details) {
        val phoneNumber = callDetails.handle.schemeSpecificPart
        val callDirection = callDetails.callDirection
        //TODO do something with callDetails. Maybe call respondToCall(callDetails, CallResponse.Builder().build())
    }
}

манифест:

...
<service android:name=".BasicCallScreeningService"
    android:permission="android.permission.BIND_SCREENING_SERVICE">
    <intent-filter>
        <action android:name="android.telecom.CallScreeningService"/>
    </intent-filter>
</service>
...

Кроме того, для телефонных звонков, которые вы не заблокировали, можно отображать действия после звонка, используя ACTION_POST_CALL Намерение:

<activity
    android:name=".AfterCallActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.telecom.action.POST_CALL" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

В самом действии вы можете получить немного информации о телефонном звонке. Пример:

{android.telecom.extra.HANDLE:tel:6505551212,android.telecom.extra.DISCONNECT_CAUSE:5,android.telecom.extra.CALL_DURATION:0}
person android developer    schedule 30.09.2020