权限拒绝:广播意图未导出

时间:2013-04-27 01:10:08

标签: android

我正在尝试在我的应用中使用bump API。我将Bump库项目导入到我的项目中。有人知道为什么会这样吗?

04-26 21:00:15.828: W/ActivityManager(528): Permission denied: checkComponentPermission() owningUid=10072

04-26 21:00:15.828: W/BroadcastQueue(528): Permission Denial: broadcasting Intent { act=com.bump.core.util.LocationDetector.PASSIVE_LOCATION_UPDATE flg=0x10 (has extras) } from com.helloworld.utility (pid=-1, uid=10071) is not exported from uid 10072 due to receiver com.bumptech.bumpga/com.bump.core.service.PassiveLocationReceiver

以下是我的AndroidManifest.xml的相关部分:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<service android:name="com.bump.api.BumpAPI">
   <intent-filter>
      <action android:name="com.bump.api.IBumpAPI" />
   </intent-filter>
</service> 

我试图查看Android源代码,它来自ActivtiyManagerService.java:

// If the target is not exported, then nobody else can get to it.
if (!exported) {
   Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid);
   return PackageManager.PERMISSION_DENIED;
}

我不确定在这种情况下“目标”是什么以及需要“导出”的是什么。有没有其他人见过这个?

谢谢你们!

2 个答案:

答案 0 :(得分:2)

您是否按照here所述注册了BroadcastReceiver?

private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    try {
        if (action.equals(BumpAPIIntents.DATA_RECEIVED)) {
            Log.i("Bump Test", "Received data from: " + api.userIDForChannelID(intent.getLongExtra("channelID", 0)));
            Log.i("Bump Test", "Data: " + new String(intent.getByteArrayExtra("data")));
        } else if (action.equals(BumpAPIIntents.MATCHED)) {
            api.confirm(intent.getLongExtra("proposedChannelID", 0), true);
        } else if (action.equals(BumpAPIIntents.CHANNEL_CONFIRMED)) {
            api.send(intent.getLongExtra("channelID", 0), "Hello, world!".getBytes());
        } else if (action.equals(BumpAPIIntents.CONNECTED)) {
            api.enableBumping();
        }
    } catch (RemoteException e) {}
}
};

IntentFilter filter = new IntentFilter();
filter.addAction(BumpAPIIntents.CHANNEL_CONFIRMED);
filter.addAction(BumpAPIIntents.DATA_RECEIVED);
filter.addAction(BumpAPIIntents.NOT_MATCHED);
filter.addAction(BumpAPIIntents.MATCHED);
filter.addAction(BumpAPIIntents.CONNECTED);
registerReceiver(receiver, filter);

另请查看android:exported的文档:

  

默认值取决于活动是否包含意图过滤器。缺少任何过滤器意味着只能通过指定其确切的类名来调用活动。这意味着该活动仅供应用程序内部使用(因为其他人不知道类名)。所以在这种情况下,默认值为“false”。另一方面,至少有一个过滤器的存在意味着该活动是供外部使用的,因此默认值为“true”。

答案 1 :(得分:2)

在服务标记中使用exported属性。例如清单中的<service android:exported="true" android:name="com.bump.api.BumpAPI">。导出属性意味着,其他应用程序将有权访问它(活动/服务/广播等)。在您的代码中exported布尔值为false,因此条件if(!exported)始终为true,因此它从那里返回。如果问题仍然存在,请进行更改。

对于文档,请转到here