android BroadcastReceiver遇到 java.lang.IllegalAccessException解决方法

android BroadcastReceiver 遇到java.lang.IllegalAccessException解决方法

我在android 中监听wifi变化服务时,遇到错误
java.lang.IllegalAccessException,sth is not accessible from class android.app.ActivityThread,主要是app中其他地方调用了默认的构造函数,必须增加默认构造函数且访问权限为public

1.错误的部分代码

//通过一个BroadcastReceiver(android 四大组建之一),用于动态注册监听网络变化
public class NetworkConnectChangedReceiver extends BroadcastReceiver{  
    OnWifiChangedListener changed;

    Activity act;

    public NetworkConnectChangedReceiver(Activity act){
        this.act = act;
    }

    public void setChangedListener(OnWifiChangedListener changed) {
        this.changed = changed;
    }
    @Override  
    public void onReceive(Context context, Intent intent) {  

        if (null == intent.getAction()){
            return ;
        }
        // TODO Auto-generated method stub  
        if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)){  
            //signal strength changed  
        }  
        else if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)){//wifi连接上与否  
            System.out.println("网络状态改变");  
            NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);  
            if (null == info.getState()){
                return ;
            }
            if(info.getState().equals(NetworkInfo.State.DISCONNECTED)){
                System.out.println("wifi网络连接断开"); 
                if (act != null){
                    //CommonAction.showToastMessageL(act, "wifi网络连接断开");
                }
            }
            else if(info.getState().equals(NetworkInfo.State.CONNECTED)){  

                WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);  
                WifiInfo wifiInfo = wifiManager.getConnectionInfo();                  

                if ((null != wifiInfo) && (null != wifiInfo.getSSID()) && (!wifiInfo.getSSID().contains("unknown"))){
                    //获取当前wifi名称  
                    System.out.println("连接到网络 " + wifiInfo.getSSID());  
                    if (act != null){
//                      CommonAction.showToastMessageL(act, "连接到网络 " + wifiInfo.getSSID());
                        changed.onChange(wifiInfo.getSSID());
                    }
                }

            }  

        }  
        else if(intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)){//wifi打开与否  
            int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_DISABLED);  

            if(wifistate == WifiManager.WIFI_STATE_DISABLED){  
                System.out.println("系统关闭wifi");  
                //CommonAction.showToastMessageL(act, "系统关闭wifi");
                changed.onClose();
            }  
            else if(wifistate == WifiManager.WIFI_STATE_ENABLED){
                System.out.println("系统开启wifi");  
                //CommonAction.showToastMessageL(act, "系统开启wifi");
            }  
        }  
    }  

    public interface OnWifiChangedListener {  
        void onChange(String wifiName);
        void onClose();
    }



//Activity 中使用上面BroadcastReceiver及注册的代码

public class ComListActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_com_list);     

        registerNetChangerReciver();
    }


    private void registerNetChangerReciver() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        if (null == netChangeRec){
            netChangeRec = new NetworkConnectChangedReceiver(this);
            netChangeRec.setChangedListener(new OnWifiChangedListener(){

                @Override
                public void onChange(String wifiName) {
                    // TODO 自动生成的方法存根
                    if (!connectWifiName.equals(wifiName)){// connected wifi is chanded
                        CommonAction.showToastMessageL(ComListActivity.this, "连接到网络 " + wifiName);
                        updateAutoMemorytData();
                        updateListViewData();
                        connectWifiName = wifiName;
                    }
                }

                @Override
                public void onClose() {
                    // TODO 自动生成的方法存根
                    connectWifiName = "";
                }

            });
        }
        registerReceiver(netChangeRec, filter);
    }
}

2.错误提示如下:
FATAL EXCEPTION: main
Process: com.chaoyuan.signalmachineconfig, PID: 4087
java.lang.RuntimeException: Unable to instantiate receiver com.chaoyuan.signalmachineconfig.NetworkConnectChangedReceiver: java.lang.IllegalAccessException: com.chaoyuan.signalmachineconfig.NetworkConnectChangedReceiver() is not accessible from class android.app.ActivityThread
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2565)
at android.app.ActivityThread.access 1700(ActivityThread.java:147)atandroid.app.ActivityThread H.handleMessage(ActivityThread.java:1362)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5238)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
Caused by: java.lang.IllegalAccessException: com.chaoyuan.signalmachineconfig.NetworkConnectChangedReceiver() is not accessible from class android.app.ActivityThread
at java.lang.Class.newInstance(Class.java:1569)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2560)
… 9 more

3.错误修改说明
错误原因主要是app中其他地方调用了默认的构造函数,必须增加默认构造函数且访问权限为public:

public class NetworkConnectChangedReceiver extends BroadcastReceiver{

........

//添加默认构造函数,且为public
public NetworkConnectChangedReceiver(){

}

public NetworkConnectChangedReceiver(Activity act){
    this.act = act;
}
.......

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值