我在通过前台服务拨打电话时遇到问题,这是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()
发出许可请求-就是这样。
屏幕上没有权限请求,无法在应用程序权限页面上授予权限。
我的问题是-如何授予这种许可?
环境:
答案 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);