【案例分析】android廣播接收不到原因分析


【概述】

本人正在學習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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM