Android放送(他のアプリが受信できないようにする)

10327 ワード

Androidブロードキャストは、他のアプリケーションが受け入れられないブロードキャストを実現するには、2つの方法があります.
  • ローカル放送
  • ブロードキャストに権限を追加ローカルブロードキャスト:プログラム内でのみ伝達されるブロードキャストであり、送信および受信は本プログラムでのみ有効である.サンプルコード:
  • public class MainActivity extends AppCompatActivity {  
        private IntentFilter intentFilter;  
        private LocalReceiver localReceiver;  
        //          。  
        private LocalBroadcastManager localBroadcastManager;  
    
    
        @Override  
        public void onCreate(Bundle savedInstanceState){  
            super.onCreate(savedInstanceState);  
            supportRequestWindowFeature(Window.FEATURE_NO_TITLE);  
            setContentView(R.layout.activity_main);  
    
        //        。  
            localBroadcastManager=LocalBroadcastManager.getInstance(this);  
    
            Button button=(Button)findViewById(R.id.button);  
            button.setOnClickListener(new View.OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    Intent intent=new Intent("com.example.tangyi.receiver5.LOCAL_BROADCAST");  
            //      。  
                    localBroadcastManager.sendBroadcast(intent);  
                }  
            });  
        //  intentFilter   action    。  
            intentFilter=new IntentFilter();  
            intentFilter.addAction("com.example.tangyi.receiver5.LOCAL_BROADCAST");  
    
        //         ,   。      action      。  
            localReceiver=new LocalReceiver();  
            localBroadcastManager.registerReceiver(localReceiver,intentFilter);  
        }  
        @Override  
        public void onDestroy(){// onDestroy()       。  
            super.onDestroy();  
        //        unregisterReceiver()  ,        。  
            localBroadcastManager.unregisterReceiver(localReceiver);  
        }  
        class  LocalReceiver extends BroadcastReceiver{  
            @Override  
            public void onReceive(Context context,Intent intent){  
                Toast.makeText(context,"         ",Toast.LENGTH_SHORT).show();  
            }  
        }  
    }  

    **ローカルブロードキャストは、静的登録によっては実現できません.静的登録はプログラムが起動しなくてもブロードキャストを受信できるようにするためです.ローカルブロードキャストは、本プログラム内で配信されており、すでに起動しているに違いないので、静的登録も全く必要ありません.**
    ブロードキャストへの権限の追加
    Androidアプリケーション開発では、次の2つのケースに遭遇することがあります.
  • 敏感な放送はサードパーティのアプリケーションを受信したくない.
  • 自分のReceiverがある放送元を受信することを制限し、悪意のある同じACTIONの放送に干渉されないようにしなければならない.

  • これらのシーンでは、ブロードキャストの権限制限が必要です.
    1つ目のシーン:誰が私のラジオを受け取る権利がありますか?
    この場合、自身がブロードキャストを適用するときに、Receiverを宣言するために必要なパラメータを追加することができます.
    まず、Androidmanifestで.xmlで新しい権限RECV_を定義XXX(カスタム権限はすべて先に宣言する必要があります)、例えば:
    name = "com.android.permission.RECV.XXX"/>

    次に、Sender appがブロードキャストを送信するときに、この権限をパラメータとして次のように入力します.
    sendBroadcast("com.andoird.XXX_ACTION", "com.android.permission.RECV_XXX");

    これにより、permission権限を有するReceiverのみが、このブロードキャストを受信するためにReceiverアプリケーションのAndroidManifestを受信することができる.xmlに対応するRECV_を追加するにはXXX権限.例:
    name = "com.android.permission.RECV.XXX"/>

    第二のシーン:誰が私にラジオを送る権利がありますか?
    この場合,Receiver appのtagにSender appが持つべき権限を宣言する必要がある.
    まず同じようにAndroidManifestでxmlで新しい権限SEND_を定義XXX、例えば:
    name = "com.android.permission.SEND.XXX"/>

    そして、ReceiverアプリのAndroidmanifest.xmlのタグに権限SEND_を追加XXXの声明は以下の通り:
    <receiver android:name=".XXXReceiver"   
              android:permission="com.android.permission.SEND_XXX">   
        <intent-filter>  
             <action android:name="com.android.XXX_ACTION" />   
        intent-filter>  
    receiver>

    これにより、Receiverは、send_を有するpermission権限のアプリケーションが発行するブロードキャスト.このような放送を送信するには、Sender appのAndroid Manifestが必要です.xmlでもこの権限の使用を宣言すると、次のようになります.
    name = "com.android.permission.SEND.XXX"/>

    動的登録ブロードキャストの権限追加の最初のステップ:自分で権限を定義し、カスタム権限を使用
    
    
    
    
    

    このアプリケーションにpermissionsを定義し、uses-permissionはこのアプリケーションにこの権限があり、アプリケーション内部の登録された動的ブロードキャストにもこの権限があることを明らかにした.
    ステップ2:登録ブロードキャストの定義
        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権限はメッセージを受信することができます.しかし、私たちのアプリケーションはすでにこの権限を登録しています.だからこの権限があります.
    ステップ3:ブロードキャストの送信
        @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を申請したので、3ステップ目のメッセージを受け取ることができます.PERMISSION_DISC権限、従ってsendBroadcast(intent,BROADCAST_PERMISSION_DISC);放送を送っても私たちは依然として受け取ることができます.2.sendBroadcast(intent,BROADCAST_PERMISSION_DISC); sendBroadcast(intent)に変更します.同様にこのメッセージを受け取ることができます.最初の意味は、このメッセージを受信したブロードキャストリスナーにBROADCASTが必要だからです.PERMISSION_DISC権限は、2番目のパラメータが削除された場合、ブロードキャストリスナーがこのメッセージを受信する権限を必要としないことを示します.