Android Xamarin: как предоставить разрешение BindTelecomConnectionService? - PullRequest
0 голосов
/ 15 февраля 2020

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

Как было предложено в комментариях к вопросу - я начал тестировать ConnectionService . Я добавил разрешение BIND_TELECOM_CONNECTION_SERVICE в файл манифеста.

Объявлен MyConnectionService класс:

[Service(Permission= Manifest.Permission.BindTelecomConnectionService)]
public class MyConnectionService : ConnectionService
{

}

И затем я запускаю этот код:

var telecomManager = (TelecomManager)GetSystemService(Context.TelecomService);
var phoneAccountHandle = new PhoneAccountHandle(
    new ComponentName(this.PackageName, nameof(MyConnectionService)), "MyApp");
var builder = new PhoneAccount.Builder(phoneAccountHandle, "CustomAccount");
var phoneAccount = builder.Build();
telecomManager.RegisterPhoneAccount(phoneAccount);

telecomManager.RegisterPhoneAccount(phoneAccount); дает мне исключение:

Java.Lang.SecurityException: 'PhoneAccount connection service requires BIND_TELECOM_CONNECTION_SERVICE permission.'

Хорошо - похоже, разрешение не предоставлено. Тестирование с помощью ActivityCompat.CheckSelfPermission() - да, оно не предоставлено.

Создание запроса на разрешение с ActivityCompat.RequestPermissions() - оно выполняется и все. Нет запроса на разрешение экрана, нет способа предоставления на странице разрешения приложения.

Мой вопрос - как предоставить разрешение такого типа?

Среда:

  • Android API Level 28
  • Тестирование на телефоне Google Pixel 2 XL, работающем Android 10

1 Ответ

0 голосов
/ 16 февраля 2020

Комментарии SushiHangover очень помогли и указали в правильном направлении. Чтобы заставить решение работать и избежать исключения, ConnectionService должен иметь собственное имя (полное имя Java имя класса) и объявление разрешения. Эти значения можно добавить либо в файл манифеста, либо объявив ServiceAttribute в коде:

 [Service(
      Name = "com.sample.MyApp.MyConnectionService", 
      Permission = Manifest.Permission.BindTelecomConnectionService, 
      Enabled = true)]
 public class MyConnectionService : ConnectionService
 {
 }

Во-вторых, имя службы должно быть точным при создании ComponentName экземпляр:

var telecomManager = (TelecomManager)GetSystemService(Context.TelecomService);
var phoneAccountHandle = new PhoneAccountHandle(
    new ComponentName(this.PackageName, "com.sample.MyApp.MyConnectionService"), 
    "GateOpener");
var builder = new PhoneAccount.Builder(phoneAccountHandle, "CustomAccount");
var phoneAccount = builder.Build();
telecomManager.RegisterPhoneAccount(phoneAccount);
...