我正在尝试在我的应用中使用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;
}
我不确定在这种情况下“目标”是什么以及需要“导出”的是什么。有没有其他人见过这个?
谢谢你们!
答案 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。