Как привязать 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.

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

Sina 29.07.2019 21:39
4
1
3 052
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

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

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

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
         }
     }
 }

для меня это не найти ROLE_SERVICE

user8462556 04.11.2020 14:17

Вы можете попробовать использовать «роль» напрямую в качестве аргумента @user8462556 и убедиться, что ваша текущая версия SDK> = 29

Naitik Soni 05.11.2020 08:16

@Natik Soni: спасибо, теперь все работает. Может быть, у вас также есть идея об этом stackoverflow.com/questions/64693996/…

user8462556 05.11.2020 10:00

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

Основная деятельность

@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
    }
}

BasicCallScreeningService

@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}

Другие вопросы по теме