2015-10-23 37 views
0

我会尽我所能地概述这种情况。主要问题是:我怎样才能动态声明两个接收相同广播的接收者,但只有一个接收者有正确的权限?在我到目前为止的测试中,由于我的应用程序持有声明的权限,两个接收者都获得了广播,而不是只有一个接收者。测试BroadcastReceiver没有收到受保护的广播

在应用程序A中,我发送了一个广播,我正在使用我定义的新许可进行保护。

在应用B中,我想确保应用A的广播实际上受到保护。所以我动态地声明了两个接收器的相同IntentFilter,一个持有新的权限,另一个没有。然而,在应用B的清单中,我当然声明<uses-permission android:name="new permission" />

但是,两个接收者都获取它,而不是只有持有该权限的人。我认为这是因为应用程序B本身被声明使用权限。这里是我的代码:

应用程序的清单:

<permission 
    android:name="com.my.custom.permission" 
    android:label="my_permission" 
    android:protectionLevel="signature" /> 

应用程序源:

Intent intent = new Intent(SOME_CUSTOM_ACTION); 
... 
sendBroadcast(intent, "com.my.custom.permission"); 

应用B清单:

<uses-permission android:name="com.my.custom.permission" /> 

应用B服务:

private BroadcastReceiver rNoPermission = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (SOME_CUSTOM_ACTION.equals(intent.getAction())) { 
      Log.d(TAG, "receiver was able to receive without permission"); 
     } 
    } 
}; 

private BroadcastReceiver rYesPermission = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (SOME_CUSTOM_ACTION.equals(intent.getAction())) { 
      Log.d(TAG, "receiver was able to receive properly with permission"); 
     } 
    } 
}; 

public void start() { 
    IntentFilter filter = new IntentFilter(SOME_CUSTOM_ACTION); 
    registerReceiver(rNoPermission, filter); // purposely don't register with permission 
    registerReceiver(rYesPermission, filter, "com.my.custom.permission", null); 
} 

public void end() { 
    unregisterReceiver(rNoPermission); 
    unregisterReceiver(rYesPermission); 
} 

流量:

  1. 应用程式安装Android的学习新的权限安装
  2. 应用B和运行
  3. 应用B start()方法被称为
  4. 切换到App A到触发发送广播
  5. 在日志中看到BroadcastReceiver被称为
  6. 通过调用end()方法
  7. 结束测试

任何想法?

回答

0

实现了我的错误所在。权限是在应用程序级别授予的,而不是在组件级别授予的。根据Android文档:

要在发送时强制执行权限,请向sendBroadcast(Intent, String)sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)提供非空权限参数。只有已经被授予此权限的接收者(通过在AndroidManifest.xml中使用标签请求它)才能够接收广播。

(来源:http://developer.android.com/reference/android/content/BroadcastReceiver.html

和:

的意图的

传送者可以确认接收者具有权限指定与所述方法调用一个非空权限。只有拥有该权限的应用程序才会收到该意图。

(来源:http://developer.android.com/training/articles/security-tips.html

所以截至目前似乎没有成为一个办法做我上面提到不使用许可和一个分裂BroadcastReceiver s转换2级独立的应用程序,一个没有。