【发布时间】: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