从BroadcastReceiver启动ACTION_CALL时的权限问题

时间:2014-07-31 14:35:46

标签: android android-intent intentfilter android-permissions

我试图拦截来自设备的拨出电话并强制用户选择一个呼叫应用(即使选择了默认应用)。

我通过在清单中定义接收器来做到这一点:

<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一起提及)?此外,我真的很感激这个问题的任何其他解决方案/解决方法。不知道为什么像这样的简单要求需要成为这样的问题。

1 个答案:

答案 0 :(得分:0)

您需要特殊权限,因为ACTION_CALL是受保护的操作,允许您直接拨打电话号码,而无需用户进行互动。这是一个安全风险,因此受到保护&#34;经许可。您还会注意到Manifest.permission没有公开定义该权限:这是系统内的有意权。