Android放送(他のアプリが受信できないようにする)
10327 ワード
Androidブロードキャストは、他のアプリケーションが受け入れられないブロードキャストを実現するには、2つの方法があります.ローカル放送 ブロードキャストに権限を追加ローカルブロードキャスト:プログラム内でのみ伝達されるブロードキャストであり、送信および受信は本プログラムでのみ有効である.サンプルコード:
**ローカルブロードキャストは、静的登録によっては実現できません.静的登録はプログラムが起動しなくてもブロードキャストを受信できるようにするためです.ローカルブロードキャストは、本プログラム内で配信されており、すでに起動しているに違いないので、静的登録も全く必要ありません.**
ブロードキャストへの権限の追加
Androidアプリケーション開発では、次の2つのケースに遭遇することがあります.敏感な放送はサードパーティのアプリケーションを受信したくない. 自分のReceiverがある放送元を受信することを制限し、悪意のある同じACTIONの放送に干渉されないようにしなければならない.
これらのシーンでは、ブロードキャストの権限制限が必要です.
1つ目のシーン:誰が私のラジオを受け取る権利がありますか?
この場合、自身がブロードキャストを適用するときに、Receiverを宣言するために必要なパラメータを追加することができます.
まず、Androidmanifestで.xmlで新しい権限RECV_を定義XXX(カスタム権限はすべて先に宣言する必要があります)、例えば:
次に、Sender appがブロードキャストを送信するときに、この権限をパラメータとして次のように入力します.
これにより、permission権限を有するReceiverのみが、このブロードキャストを受信するためにReceiverアプリケーションのAndroidManifestを受信することができる.xmlに対応するRECV_を追加するにはXXX権限.例:
第二のシーン:誰が私にラジオを送る権利がありますか?
この場合,Receiver appのtagにSender appが持つべき権限を宣言する必要がある.
まず同じようにAndroidManifestでxmlで新しい権限SEND_を定義XXX、例えば:
そして、ReceiverアプリのAndroidmanifest.xmlのタグに権限SEND_を追加XXXの声明は以下の通り:
これにより、Receiverは、send_を有するpermission権限のアプリケーションが発行するブロードキャスト.このような放送を送信するには、Sender appのAndroid Manifestが必要です.xmlでもこの権限の使用を宣言すると、次のようになります.
動的登録ブロードキャストの権限追加の最初のステップ:自分で権限を定義し、カスタム権限を使用
このアプリケーションにpermissionsを定義し、uses-permissionはこのアプリケーションにこの権限があり、アプリケーション内部の登録された動的ブロードキャストにもこの権限があることを明らかにした.
ステップ2:登録ブロードキャストの定義
ブロードキャストを登録し、このブロードキャストにはBROADCASTが必要であることを明らかにした.PERMISSION_DISC権限はメッセージを受信することができます.しかし、私たちのアプリケーションはすでにこの権限を登録しています.だからこの権限があります.
ステップ3:ブロードキャストの送信
受信メッセージを表すブロードキャストには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番目のパラメータが削除された場合、ブロードキャストリスナーがこのメッセージを受信する権限を必要としないことを示します.
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つのケースに遭遇することがあります.
これらのシーンでは、ブロードキャストの権限制限が必要です.
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番目のパラメータが削除された場合、ブロードキャストリスナーがこのメッセージを受信する権限を必要としないことを示します.