【概述】
本人正在學習android開發,最近在練習android自定義廣播的時候,發現廣播怎么也接收不到。甚是奇怪,看到網上也有很多同學遇到同樣的問題。今天特別總結一下,以供大家參考。當然如有紕漏錯誤,望各位指正。
本次討論的是廣播訪問的權限問題,對於顯示或者隱式的問題,不在這里贅述。
【版本】
API版本為v21
【問題概述】
我先介紹一下我學習的例子。非常簡單,通過一個button觸發一個自定廣播。
代碼如下。
1 public class MyBroadcastReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 Log.i("TEST", "received in MyBroadcastReceiver"); 6 7 Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_LONG).show(); 8 } 9 10 }
界面部分就是一個button,這里就略了。
button邏輯如下:
因為安全問題,所以設置了接收權限。sendBroadcast的第二個參數為, com.example.broadcasttest.RECV_MYBC.(這個也是本次問題的原因)
PS:如果不設置訪問權限,會有Exported receiver does not require permission告警。原因是第三方應用可以通過發送該廣播觸發該邏輯,從而產生安全風險。具體細節可以百度一下。
com.example.broadcasttest.MY_BROADCAST為自定義的廣播。
public class MainActivity extends Activity { private Button buttonSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonSend = (Button)findViewById(R.id.button_send); buttonSend.setOnClickListener(new OnClickListener() { // // 觸發自定的廣播,廣播定義為com.example.broadcasttest.MY_BROADCAST // 設置接收權限為RECV_MYBC // @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); sendBroadcast(intent,"com.example.broadcasttest.RECV_MYBC"); } }); } }
AndroidManifast.xml中,也對這個receiver添加權限。
<receiver android:name="com.example.broadcasttest.MyBroadcastReceiver" android:permission="com.example.broadcasttest.RECV_MYBC" > <intent-filter> <action android:name="com.example.broadcasttest.MY_BROADCAST" /> </intent-filter> </receiver>
現象是廣播接受失敗。
【問題根因】
這里的權限沒有申明,凡是自定義的權限是需要在AndroidManifast.xml中定義的。
【解決方案】
在AndroidManifest.xml中添加自定義權限的權限申明和權限使用
<permission android:name="com.example.broadcasttest.RECV_MYBC" android:protectionLevel="normal" /> <uses-permission android:name="com.example.broadcasttest.RECV_MYBC" />
注意幾點:
1. 不設置訪問權限是可以成功的。權限不是必須的。
2. 自定義權限的名字要帶上包名,不帶包名可能是有問題的。
練習代碼下載:
http://download.csdn.net/detail/mimiduck/9430272