我正在制作一个创建自定义呼叫接收屏幕的应用程序。我设法显示了屏幕并添加了一个拒绝来电的按钮。为了接受来电,我的代码无法正常工作。我正在尝试使用有序广播来接听电话,但是代码不起作用。它不会引发任何异常或崩溃。它什么也没做。这是我正在使用的代码:
Intent answer = new Intent(Intent.ACTION_MEDIA_BUTTON);
answer.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
sendOrderedBroadcast(answer, null);
我正在修改旧问题。 谢谢。
答案 0 :(得分:0)
正如“异常”消息中所述,您没有接听电话的权限。
Android使用权限系统来保护应用程序对敏感功能的访问。当您要使用某些功能时,需要在清单中声明执行此操作的权限。
有两种权限:普通和危险。如果在清单中声明了普通选项,则会自动授予它们。危险用户还需要运行时批准:您的应用在运行时请求声明的权限,而Android会提示用户进行批准。详细了解此here。
您要查找的权限是Manifest.permission.ANSWER_PHONE_CALLS
。
像这样在清单中声明它:
<manifest […]>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
<!-- declare other permissions the same way here -->
[…]
</manifest>
在运行时,检查您是否具有所需的权限,并且只有在执行此操作时才能执行操作:
if(ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.ANSWER_PHONE_CALLS)
== PackageManager.PERMISSION_GRANTED) {
// Your code using the dangerous permission goes here
} else {
// request the permission, see below
}
thisActivity
是您当前的活动。
要请求许可,请使用:
ActivityCompat.requestPermissions(thisActivity,
new String[] {Manifest.permission.ANSWER_PHONE_CALLS},
PERMISSIONS_ANSWER_PHONE_CALLS);
PERMISSIONS_ANSWER_PHONE_CALLS
是您用唯一值定义的int
常量。
该权限是异步请求的,这意味着在授予或拒绝该权限时会通知您。要接收此通知,请覆盖此回调:
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permissions, int[] grantResults) {
switch(requestCode) { // check which permission was requested
case PERMISSIONS_REQUEST_ANSWER_PHONE_CALLS:
// check whether permission was granted
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted; you can call your method requiring this permission now
} else {
// permission was denied, you probably want to show a message that your feature won't be available
}
return;
// code for other permission requests goes here
}
}