Android Xamarin:如何授予BindTelecomConnectionService权限?

时间:2020-02-15 16:44:09

标签: c# android xamarin xamarin.android

我在通过前台服务拨打电话时遇到问题,这是my question

如问题注释中所建议-我开始测试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级别28
  • 在运行Android 10的Google Pixel 2 XL手机上进行测试

1 个答案:

答案 0 :(得分:0)

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);