我试图拦截来自设备的拨出电话并强制用户选择一个呼叫应用(即使选择了默认应用)。
我通过在清单中定义接收器来做到这一点:
<receiver android:name="com.myapp.OutgoingCallsReceiver" >
<intent-filter android:priority="0">
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
接收者的代码是:
@Override
public void onReceive(Context context, Intent intent) {
String destinationNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
setResultData(null);
abortBroadcast();
Intent callIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + destinationNumber));
callIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, destinationNumber);
Intent chooserIntent = Intent.createChooser(callIntent, "How do you want to make this call?");
chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(chooserIntent);
}
当正在进行呼叫时,我确实看到应用选择器对话框(在我的设备上,使用本机拨号器,Skype和我的应用),但是当从该对话框中选择本机拨号器时,我得到以下异常:
07-31 12:33:46.125:E / DatabaseUtils(2345):为包裹写例外
07-31 12:33:46.125:E / DatabaseUtils(2345): java.lang.SecurityException:Permission Denial:用户的get / set设置要求以用户-2运行,但是从用户0调用;这需要android.permission.INTERACT_ACROSS_USERS_FULL
07-31 12:33:46.125:E / DatabaseUtils(2345):at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13140)
07-31 12:33:46.125:E / DatabaseUtils(2345):在android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2038)
07-31 12:33:46.125:E / DatabaseUtils(2345):at com.android.providers.settings.SettingsProvider.callFromPackage(SettingsProvider.java:607)
07-31 12:33:46.125:E / DatabaseUtils(2345):在android.content.ContentProvider $ Transport.call(ContentProvider.java:279)
07-31 12:33:46.125:E / DatabaseUtils(2345):在android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273)
07-31 12:33:46.125:E / DatabaseUtils(2345):在android.os.Binder.execTransact(Binder.java:388)
07-31 12:33:46.125:E / DatabaseUtils(2345):at com.android.server.SystemServer.init1(Native Method)
07-31 12:33:46.125:E / DatabaseUtils(2345):at com.android.server.SystemServer.main(SystemServer.java:2012)
07-31 12:33:46.125:E / DatabaseUtils(2345):at java.lang.reflect.Method.invokeNative(Native Method)
07-31 12:33:46.125:E / DatabaseUtils(2345):at java.lang.reflect.Method.invoke(Method.java:525)
07-31 12:33:46.125:E / DatabaseUtils(2345):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1046)
07-31 12:33:46.125:E / DatabaseUtils(2345):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
07-31 12:33:46.125:E / DatabaseUtils(2345):at dalvik.system.NativeStart.main(Native Method)
07-31 12:33:46.125:W / ActivityManager(2345):权限拒绝:用户的获取/设置设置要求以用户-2运行,但是从用户0调用;这需要android.permission.INTERACT_ACROSS_USERS_FULL
为什么会这样?为什么我需要这个特别许可?不知道怎么解决这个问题? 感谢。
修改
更多地概括我的问题 - 在什么情况下可以使用ACTION_CALL启动传出呼叫?为什么在这些情况下不需要这个INTERACT_ACROSS_USERS_FULL权限(我假设它不需要,因为它没有在文档中与ACTION_CALL一起提及)?此外,我真的很感激这个问题的任何其他解决方案/解决方法。不知道为什么像这样的简单要求需要成为这样的问题。
答案 0 :(得分:0)
您需要特殊权限,因为ACTION_CALL
是受保护的操作,允许您直接拨打电话号码,而无需用户进行互动。这是一个安全风险,因此受到保护&#34;经许可。您还会注意到Manifest.permission
没有公开定义该权限:这是系统内的有意权。