Android动态广播添加权限

最近公司内部一些安全工具扫描代码老是报动态广播没有添加权限问题,为了防止应用内部的广播不能轻易的发送到外部应用中,或者应用内部不轻易的接收外部广播,加上安全权限访问还是有必要的。
第一步:自己定义权限,并且使用自定义权限

    <uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />

    <permission
        android:name="com.cn.customview.permissions.MY_BROADCAST"
        android:protectionLevel="signature" >
    permission>

给这个应用程序定义了一个permissions并且uses-permission申明使用,这是这个应用就有了这个权限,并且应用内部的注册的动态广播也拥有了这个权限。

第二步:定义注册广播

    private static final String BROADCAST_PERMISSION_DISC = "com.cn.customview.permissions.MY_BROADCAST";
    private static final String BROADCAST_ACTION_DISC = "com.cn.customview.permissions.my_broadcast";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.broadcast_permissions_activity);
        ButterKnife.bind(this);
        // 注册广播接收
        BroadcastReceiver receiveBroadCast = new ReceiveBroadCast();
        IntentFilter filter = new IntentFilter();
        filter.addAction(BROADCAST_ACTION_DISC); // 只有持有相同的action的接受者才能接收此广播
        registerReceiver(receiveBroadCast, filter,BROADCAST_PERMISSION_DISC,null);
    }

    public class ReceiveBroadCast extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(BroadcastPermissionsActivity.this,
                    "receive broadcast", 0).show();
        }

    }

注册一个广播,并且申明,这个广播需要BROADCAST_PERMISSION_DISC权限才能收到消息。但是我们应用程序已经注册了这个权限。所以是有这个权限的。

第三步: 发送广播

    @OnClick(R.id.btn_send_broadcast)
    public void sendBroadcastWithPermissions() {
        Intent intent = new Intent();  //Itent就是我们要发送的内容
        intent.putExtra("data", "this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND));  
        intent.setAction(BROADCAST_ACTION_DISC);   //设置你这个广播的action,只有和这个action一样的接受者才能接受者才能接收广播
        sendBroadcast(intent,BROADCAST_PERMISSION_DISC);   //发送广播
    }

代表接收消息的广播需要BROADCAST_PERMISSION_DISC权限,其实跟上一种方式的定义效果一样。

至此,安全检查工具报错消除。

注意:
1.registerReceiver(receiveBroadCast, filter,BROADCAST_PERMISSION_DISC,null);如果改为registerReceiver(receiveBroadCast, filter); 照样能够收到第三步发送的消息,因为我们在xml里面已经申请了BROADCAST_PERMISSION_DISC权限,所以sendBroadcast(intent,BROADCAST_PERMISSION_DISC);发送广播我们依然能收到。
2.sendBroadcast(intent,BROADCAST_PERMISSION_DISC); 改为sendBroadcast(intent);也同样能收到这个消息。因为第一个的意思是收到这个消息的广播监听器必须有BROADCAST_PERMISSION_DISC权限,如果第二个参数去掉,则说明广播监听器不需要任何权限就能收到这个消息。

你可能感兴趣的:(Android)