【问题标题】:Permission issue when initiating ACTION_CALL from BroadcastReceiver从 BroadcastReceiver 启动 ACTION_CALL 时的权限问题
【发布时间】:2014-09-23 13:29:31
【问题描述】:

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

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

<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 setting for user asks to run as user -2 but is call from user 0;这需要 android.permission.INTERACT_ACROSS_USERS_FULL
07-31 12:33:46.125: E/DatabaseUtils(2345): 在 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): 在 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):在 com.android.server.SystemServer.init1(本机方法)
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): 在 java.lang.reflect.Method.invokeNative(Native Method)
07-31 12:33:46.125: E/DatabaseUtils(2345): 在 java.lang.reflect.Method.invoke(Method.java:525)
07-31 12:33:46.125: E/DatabaseUtils(2345): 在 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): 在 dalvik.system.NativeStart.main(Native Method)
07-31 12:33:46.125: W/ActivityManager(2345): Permission Denial: get/set setting for user asks to run as user -2 but is call from user 0;这需要 android.permission.INTERACT_ACROSS_USERS_FULL

为什么会这样?为什么我需要这个特别许可?知道如何解决这个问题吗? 谢谢。

编辑:
进一步概括我的问题 - 在什么情况下可以使用 ACTION_CALL 发起拨出电话?为什么在这些情况下不需要这个 INTERACT_ACROSS_USERS_FULL 权限(我假设它是不需要的,因为它没有在文档中与 ACTION_CALL 一起提到)?另外,我真的很感激这个问题的任何其他解决方案/解决方法。不知道为什么像这样的简单需求会出现这样的问题。

【问题讨论】:

    标签: android android-intent intentfilter android-permissions


    【解决方案1】:

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

    【讨论】:

    • 那么这里可以做什么呢?添加此权限是否有任何我应该担心的影响?如果是这样,你能想到任何其他方式来强制用户选择调用应用程序吗?
    • 您可以尝试使用&lt;uses-permission&gt; 在清单中添加该权限字符串,但由于它是受保护的权限,因此它可能有效,也可能无效。这确实打破了 Android Intent 分辨率范式,特别是如果用户已经选择了他们希望始终使用的应用程序来拨号。在考虑是否执行此操作时,您需要谨慎。曾经用来玩游戏并不断覆盖系统的大型 VoIP 应用程序之一——它很快就在我的手机上被卸载了。这就像每次你做某事时都会在浏览器中弹出一个窗口:非常烦人。
    • 我感觉有人会在这里说些什么;) 2 个事实: 1. 我只在特定条件下显示它。 2. 从设备拨打常规电话时(例如,不是通过单击 url),永远无法获得应用程序选择器对话框。即使您清除了设备设置中的默认值。您也可以将其视为对 android Intent 解析范式的破坏。无论如何,我将尝试添加此权限,看看效果如何。谢谢。
    • 没用。另外,我不能只添加这个权限 - “这个权限是签名级别的权限,我们只能在我的应用程序的签名与系统相同的情况下使用它”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2016-11-20
    • 2011-06-06
    相关资源
    最近更新 更多