尝试在空对象引用上调用虚拟方法“android.os.Looper android.content.Context.getMainLooper()" [英] Attempt to invoke virtual method 'android.os.Looper android.content.Context.getMainLooper()' on a null object reference

查看:37
本文介绍了尝试在空对象引用上调用虚拟方法“android.os.Looper android.content.Context.getMainLooper()"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每当我尝试在手机或模拟器上打开应用程序时,我的 Log cat 都会收到此错误.为了让您大致了解我目前正在做的项目,它是一个记录连接到手机接入点的设备数据的系统,可以通过屏幕上的按钮打开和关闭.

我想归功于:

  1. Android 2.3 wifi 热点 API

  1. https://www.whitebyte.info/android/android-wifi-hotspot-manager-class

Log cat 文件的图像是:https://i.gyazo.com/fa068fd1fce3f27f43185c0cd12568c1p.png我的主要活动课

公共类 MainActivity 扩展 ActionBarActivity{boolean wasApEnabled = false;静态接入点 wifiAP;私人 WifiManager wifi;静态按钮 apButton;静态文本视图文本视图;@覆盖protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);apButton = (Button) findViewById(R.id.toggleBtn);textView = (TextView) findViewById(R.id.wifiClients);wifiAP = new AccessPoint();wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);扫描();apButton.setOnClickListener(new View.OnClickListener() {公共无效onClick(查看视图){wifiAP.toggleWifiAP(wifi, MainActivity.this);}});getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_DIM_BEHIND);}私人无效扫描(){wifiAP.getClientList(false, new FinishScanListener() {@覆盖public void onFinishScan(final ArrayList clients) {textView.setText("WifiApState:" + wifiAP.getWifiApState()+ "\n\n");textView.append("客户:\n");for (ClientScanResult clientScanResult : 客户端){textView.append("======================\n");textView.append("ipAddress:" + clientScanResult.getIpAddress() + "\n");textView.append("设备:" + clientScanResult.getDevice() + "\n");textView.append("macAddress:" + clientScanResult.getMacAddress() + "\n");textView.append("isReachable: "+ clientScanResult.isReachable() + "\n");}}});}@覆盖公共无效 onResume() {super.onResume();如果(wasApEnabled){if (wifiAP.getWifiApState() != wifiAP.WIFI_STATE_ENABLED && wifiAP.getWifiApState() != wifiAP.WIFI_STATE_ENABLING) {wifiAP.toggleWifiAP(wifi, MainActivity.this);}}更新状态显示();}@覆盖公共无效 onPause() {super.onPause();boolean wifiApIsOn = wifiAP.getWifiApState()==wifiAP.WIFI_STATE_ENABLED ||wifiAP.getWifiApState()==wifiAP.WIFI_STATE_ENABLING;如果(wifiApIsOn){wasApEnabled = true;wifiAP.toggleWifiAP(wifi, MainActivity.this);}别的 {wasApEnabled = false;}更新状态显示();}public static void updateStatusDisplay(){if (wifiAP.getWifiApState()==wifiAP.WIFI_STATE_ENABLED || wifiAP.getWifiApState()==wifiAP.WIFI_STATE_ENABLED){apButton.setText(关闭");}别的 {apButton.setText(开启");}}@覆盖公共布尔 onCreateOptionsMenu(菜单菜单){menu.add(0,0,0, 获取客户");返回 super.onCreateOptionsMenu(menu);}public boolean onOptionsItemSelected(int featureId, MenuItem item) {开关(item.getItemId()){案例0:扫描();休息;}返回 super.onMenuItemSelected(featureId, item);}}

AccessPoint 类

public class AccessPoint extends Activity {私有静态 int 常量 = 0;私有上下文上下文;私有静态 int WIFI_STATE_UNKNOWN = -1;私有静态 int WIFI_STATE_DISABLING = 0;私有静态 int WIFI_STATE_DISABLED = 1;公共静态 int WIFI_STATE_ENABLING = 2;公共静态 int WIFI_STATE_ENABLED = 3;私有静态 int WIFI_STATE_FAILED = 4;最终静态字符串[] WIFI_STATE_TEXTSTATE = 新字符串[]{禁用"、禁用"、启用"、启用"、失败"};私人 WifiManager wifi;private String TAG =WifiAP";私人 int stateWifi = -1;private boolean alwaysEnabledWifi = true;//开启或关闭wifi公共无效toggleWifiAP(WifiManager wifiHandler,上下文上下文){如果(wifi == null){wifi = wifiHandler;}布尔 wifiApIsOn = getWifiApState() == WIFI_STATE_ENABLED ||getWifiApState()==WIFI_STATE_ENABLING;new SetWifiApTask(!wifiApIsOn, false, context).execute();}私有 int setWifiApEnabled(启用布尔值){Log.d(TAG,设置wifi启用调用"+启用);WifiConfiguration config = new WifiConfiguration();config.SSID =参加讲座";config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);//记住无线状态如果(启用&& stateWifi == -1){stateWifi = wifi.getWifiState();}//关闭无线如果(启用&& wifi.getConnectionInfo() !=null){Log.d(TAG,禁用wifi:呼叫");wifi.setWifiEnabled(false);int loopMax = 10;while (loopMax > 0 && wifi.getWifiState() != WifiManager.WIFI_STATE_DISABLED){Log.d(TAG, 禁用 Wifi:等待,通过:" + (10-loopMax));尝试{线程睡眠(500);loopMax--;}catch(异常 e){e.printStackTrace();}}Log.d(TAG,"禁用wifi完成,通过:"+(10-loopMax));}//启用和禁用wifi APint state = WIFI_STATE_UNKNOWN;尝试 {Log.d(TAG,(启用?启用":禁用")+wifi ap:调用");wifi.setWifiEnabled(false);Method method1 = wifi.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);method1.invoke(wifi, config, enabled);方法 method2 = wifi.getClass().getMethod("getWifiState");state = (Integer)method2.invoke(wifi);}catch(异常 e){//Log.e(WIFI_SERVICE, e.getMessage());}//在处理发生时使用线程如果(!启用){int loopMax = 10;while (loopMax>0 && (getWifiApState()==WIFI_STATE_DISABLING || getWifiApState()==WIFI_STATE_ENABLED || getWifiApState()==WIFI_STATE_FAILED)){Log.d(TAG,(启用?启用":禁用")+wifi AP:等待,通过:"+(10-loopMax));尝试 {线程睡眠(500);loopMax--;}catch(异常 e){}}Log.d(TAG,(启用?启用":禁用")+Wifi ap:完成,通过:+(10-loopMax));//开启无线网络if (stateWifi==WifiManager.WIFI_STATE_ENABLED || stateWifi==WifiManager.WIFI_STATE_ENABLING || stateWifi==WifiManager.WIFI_STATE_UNKNOWN || alwaysEnabledWifi){Log.d(TAG,启用wifi:呼叫");wifi.setWifiEnabled(true);//这种方式它不会阻止事情并等待它被启用}stateWifi = -1;}否则如果(启用){int loopMax = 10;while (loopMax>0 && (getWifiApState()==WIFI_STATE_ENABLING || getWifiApState()==WIFI_STATE_DISABLED || getWifiApState()==WIFI_STATE_FAILED)){Log.d(TAG,(启用?启用":禁用")+wifi ap:等待,通过:"+(10-loopMax));尝试{线程睡眠(500);loopMax--;}catch(异常 e){}}Log.d(TAG,(启用?启用":禁用")+wifi ap:完成,通过:"+(10-loopMax));}返回状态;}//获取wifi AP状态公共 int getWifiApState(){int state = WIFI_STATE_UNKNOWN;尝试 {Method method2 = wifi.getClass().getMethod("getWifiApState");state = (Integer) method2.invoke(wifi);}catch(异常 e){}如果(状态> = 10){常数=10;}WIFI_STATE_DISABLING = 0+常数;WIFI_STATE_DISABLED = 1+常数;WIFI_STATE_ENABLING = 2+常数;WIFI_STATE_ENABLED = 3+常数;WIFI_STATE_FAILED = 4+常数;Log.d(TAG, "getWifiApState " + (state==-1?"UNKNOWN":WIFI_STATE_TEXTSTATE[state-constant]));返回状态;}class SetWifiApTask 扩展了 AsyncTask{布尔 mMode;布尔 mFinish;ProgressDialog pDialog;公共 SetWifiApTask(布尔模式,布尔完成,上下文上下文){mMode = 模式;mFinish = 完成;pDialog = new ProgressDialog(context);}@覆盖protected void onPreExecute(){super.onPreExecute();pDialog.setTitle(打开接入点"+(mMode?开":关"+..."));pDialog.setMessage("请稍等...");pDialog.show();}@覆盖protected void onPostExecute(Void aVoid){super.onPostExecute(aVoid);尝试 {pDialog.dismiss();MainActivity.updateStatusDisplay();}catch (IllegalArgumentException e){};如果(mFinish){结束();}}@覆盖受保护的 Void doInBackground(Void... params) {setWifiApEnabled(mMode);返回空;}}//获取连接到wifi热点的列表public void getClientList(boolean onlyReachable, FinishScanListener finishListener){getClientList(onlyReachable, 300, finishListener);}public void getClientList(final boolean onlyReachable, final intreachableTimeout, final FinishScanListener finishListener){可运行可运行 = 新可运行(){@覆盖公共无效运行(){BufferedReader br = null;最终的 ArrayList结果 = 新的 ArrayList();尝试 {br = new BufferedReader(new FileReader("/proc/net/arp"));字符串线;while ((line = br.readLine()) != null){String[] splitted = line.split("+");if ((splitted !=null) && (splitted.length >=4)){字符串 mac = 拆分 [3];if (mac.matches("..:..:..:..:..:..")){boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout);if (!onlyReachable || isReachable){result.add(new ClientScanResult(splitted[0],splitted[3],splitted[5],isReachable));}}}}}catch(异常 e){Log.e(this.getClass().toString(), e.toString());}最后 {尝试 {br.close();}catch (IOException e){Log.e(this.getClass().toString(), e.getMessage());}}//获取将用于发布到主线程的处理程序Handler mainHandler = new Handler(context.getMainLooper());Runnable myRunnable = new Runnable() {@覆盖公共无效运行(){finishListener.onFinishScan(result);}};mainHandler.post(myRunnable);}};线程 myThread = 新线程(可运行);myThread.start();}}

据我所知,你的 Contextnull.您在类的顶部有一个私有变量 Context,但您从未为其分配任何内容,因此它是 null.

给你的 AccessPoint 一个构造函数并输入类似的东西

context = getContext();

里面.

I am getting this error in my Log cat whenever I try to open the application on either my phone or the emulator. To give you an overview of the project that I am currently doing, it is a system that records the data of the devices connected to the access point on the phone which can be toggled on and off via a button on screen.

I want to give credit to:

  1. Android 2.3 wifi hotspot API

and

  1. https://www.whitebyte.info/android/android-wifi-hotspot-manager-class

an image of the Log cat file is: https://i.gyazo.com/fa068fd1fce3f27f43185c0cd12568c1.png

my main activity class

public class MainActivity extends ActionBarActivity{

boolean wasApEnabled = false;
static AccessPoint wifiAP;
private WifiManager wifi;
static Button apButton;
static TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    apButton = (Button) findViewById(R.id.toggleBtn);
    textView = (TextView) findViewById(R.id.wifiClients);

    wifiAP = new AccessPoint();
    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    scan();

    apButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            wifiAP.toggleWifiAP(wifi, MainActivity.this);
        }
    });

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_DIM_BEHIND);

}

private void scan(){
    wifiAP.getClientList(false, new FinishScanListener() {
        @Override
        public void onFinishScan(final ArrayList<ClientScanResult> clients) {
            textView.setText("WifiApState:" + wifiAP.getWifiApState()+ "\n\n");
            textView.append("Clients: \n");
            for (ClientScanResult clientScanResult : clients){
                textView.append("====================\n");
                textView.append("ipAddress: " + clientScanResult.getIpAddress() + "\n");
                textView.append("Device: " + clientScanResult.getDevice() + "\n");
                textView.append("macAddress: " + clientScanResult.getMacAddress() + "\n");
                textView.append("isReachable: " + clientScanResult.isReachable() + "\n");

            }
        }
    });
}

@Override
public void onResume() {
    super.onResume();
    if (wasApEnabled) {
        if (wifiAP.getWifiApState() != wifiAP.WIFI_STATE_ENABLED && wifiAP.getWifiApState() != wifiAP.WIFI_STATE_ENABLING) {
            wifiAP.toggleWifiAP(wifi, MainActivity.this);
        }
    }
    updateStatusDisplay();
}

@Override
public void onPause() {
    super.onPause();
    boolean wifiApIsOn = wifiAP.getWifiApState()==wifiAP.WIFI_STATE_ENABLED || wifiAP.getWifiApState()==wifiAP.WIFI_STATE_ENABLING;
    if (wifiApIsOn){
        wasApEnabled = true;
        wifiAP.toggleWifiAP(wifi, MainActivity.this);
    }else {
        wasApEnabled = false;
    }
    updateStatusDisplay();
}

public static void updateStatusDisplay(){
    if (wifiAP.getWifiApState()==wifiAP.WIFI_STATE_ENABLED || wifiAP.getWifiApState()==wifiAP.WIFI_STATE_ENABLING){
        apButton.setText("Turn Off");
    }else {
        apButton.setText("Turn on");
    }
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0,0,0, "Get Clients");
    return super.onCreateOptionsMenu(menu);
}

public boolean onOptionsItemSelected(int featureId, MenuItem item) {
    switch (item.getItemId()){
        case 0:
            scan();
            break;
    }
    return super.onMenuItemSelected(featureId, item);
}
}

AccessPoint class

public class AccessPoint extends Activity {
private static int constant = 0;
private Context context;

private static int WIFI_STATE_UNKNOWN = -1;
private static int WIFI_STATE_DISABLING = 0;
private static int WIFI_STATE_DISABLED = 1;
public static int WIFI_STATE_ENABLING = 2;
public static int WIFI_STATE_ENABLED = 3;
private static int WIFI_STATE_FAILED = 4;

final static String[] WIFI_STATE_TEXTSTATE = new String[]{
        "DISABLING","DISABLED","ENABLING","ENABLED","FAILED"
};

private WifiManager wifi;
private String TAG = "WifiAP";

private int stateWifi = -1;
private boolean alwaysEnabledWifi = true;


//enable or disable the wifi
public void toggleWifiAP(WifiManager wifiHandler, Context context){
    if (wifi == null){
        wifi = wifiHandler;
    }
    boolean wifiApIsOn = getWifiApState() == WIFI_STATE_ENABLED || getWifiApState()==WIFI_STATE_ENABLING;
    new SetWifiApTask(!wifiApIsOn, false, context).execute();
}

private int setWifiApEnabled(boolean enabled){
    Log.d(TAG, "Set wifi enabled called" + enabled);

    WifiConfiguration config = new WifiConfiguration();
    config.SSID = "Attend Lecture";
    config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

    //remember wireless state
    if (enabled && stateWifi == -1){
        stateWifi = wifi.getWifiState();
    }

    //disable the wireless
    if (enabled && wifi.getConnectionInfo() !=null){
        Log.d(TAG, "disable wifi: calling");
        wifi.setWifiEnabled(false);
        int loopMax = 10;
        while (loopMax > 0 && wifi.getWifiState() != WifiManager.WIFI_STATE_DISABLED){
            Log.d(TAG, "Disable Wifi: Waiting, pass:" + (10-loopMax));
            try{
                Thread.sleep(500);
                loopMax--;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        Log.d(TAG, "Disabling wifi is done, pass: " + (10-loopMax));
    }

    //enable and disable wifi AP
    int state = WIFI_STATE_UNKNOWN;
    try {
        Log.d(TAG, (enabled?"enabling":"Disabling")+"wifi ap: calling");
        wifi.setWifiEnabled(false);
        Method method1 = wifi.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class);
        method1.invoke(wifi, config, enabled);
        Method method2 = wifi.getClass().getMethod("getWifiState");
        state = (Integer)method2.invoke(wifi);
    }catch (Exception e){
        //Log.e(WIFI_SERVICE, e.getMessage());
    }

    //Use thread while processing occurs
    if (!enabled){
        int loopMax = 10;
        while (loopMax>0 && (getWifiApState()==WIFI_STATE_DISABLING || getWifiApState()==WIFI_STATE_ENABLED || getWifiApState()==WIFI_STATE_FAILED)){
            Log.d(TAG, (enabled?"enabling": "disabling")+ "wifi AP: waiting, pass:" + (10-loopMax));
            try {
                Thread.sleep(500);
                loopMax--;
            }catch (Exception e){

            }
        }
        Log.d(TAG, (enabled?"enabling":"disabling")+" Wifi ap: done, pass: " + (10-loopMax));

        //enable the wifi
        if (stateWifi==WifiManager.WIFI_STATE_ENABLED || stateWifi==WifiManager.WIFI_STATE_ENABLING || stateWifi==WifiManager.WIFI_STATE_UNKNOWN || alwaysEnabledWifi){
            Log.d(TAG, "enable wifi: Calling");
            wifi.setWifiEnabled(true);
            //this way it doesnt hold things up and waits for it to get enabled
        }

        stateWifi = -1;
    }else if (enabled){
        int loopMax = 10;
        while (loopMax>0 && (getWifiApState()==WIFI_STATE_ENABLING || getWifiApState()==WIFI_STATE_DISABLED || getWifiApState()==WIFI_STATE_FAILED)){
            Log.d(TAG, (enabled?"Enabling": "disabling") + "wifi ap: waiting, pass: " + (10-loopMax));
            try{
                Thread.sleep(500);
                loopMax--;
            }catch (Exception e){

            }
        }
        Log.d(TAG, (enabled?"Enabling": "disabling")+ "wifi ap: done, pass: " + (10-loopMax));
    }
    return state;
}

//Get the wifi AP state
public int getWifiApState(){
    int state = WIFI_STATE_UNKNOWN;
    try {
        Method method2 = wifi.getClass().getMethod("getWifiApState");
        state = (Integer) method2.invoke(wifi);
    }catch (Exception e){

    }

    if (state>=10){
        constant=10;
    }

    WIFI_STATE_DISABLING = 0+constant;
    WIFI_STATE_DISABLED = 1+constant;
    WIFI_STATE_ENABLING = 2+constant;
    WIFI_STATE_ENABLED = 3+constant;
    WIFI_STATE_FAILED = 4+constant;

    Log.d(TAG, "getWifiApState " + (state==-1?"UNKNOWN":WIFI_STATE_TEXTSTATE[state-constant]));
    return state;
}

class SetWifiApTask extends AsyncTask<Void, Void, Void>{
    boolean mMode;
    boolean mFinish;
    ProgressDialog pDialog;

    public SetWifiApTask(boolean mode, boolean finish, Context context){
        mMode = mode;
        mFinish = finish;
        pDialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        pDialog.setTitle("Turning on Access Point " + (mMode?"On":"Off" + "..."));
        pDialog.setMessage("Please wait a moment...");
        pDialog.show();
    }

    @Override
    protected void onPostExecute(Void aVoid){
        super.onPostExecute(aVoid);
        try {
            pDialog.dismiss();
            MainActivity.updateStatusDisplay();
        }catch (IllegalArgumentException e){

        };
        if (mFinish){
            finish();
        }
    }

    @Override
    protected Void doInBackground(Void... params) {
        setWifiApEnabled(mMode);
        return null;
    }
}

//get the list connected to the wifi hotspot
public void getClientList(boolean onlyReachable, FinishScanListener finishListener){
    getClientList(onlyReachable, 300, finishListener);
}

public void getClientList(final boolean onlyReachable, final int reachableTimeout, final FinishScanListener finishListener){

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            BufferedReader br = null;
            final ArrayList<ClientScanResult> result = new ArrayList<>();

            try {
                br = new BufferedReader(new FileReader("/proc/net/arp"));
                String line;
                while ((line = br.readLine()) != null){
                    String[] splitted = line.split(" +");

                    if ((splitted !=null) && (splitted.length >=4)){
                        String mac = splitted[3];

                        if (mac.matches("..:..:..:..:..:..")){
                            boolean isReachable = InetAddress.getByName(splitted[0]).isReachable(reachableTimeout);

                            if (!onlyReachable || isReachable){
                                result.add(new ClientScanResult(splitted[0], splitted[3], splitted[5], isReachable));
                            }
                        }
                    }
                }
            }catch (Exception e){
                Log.e(this.getClass().toString(), e.toString());
            }finally {
                try {
                    br.close();
                }catch (IOException e){
                    Log.e(this.getClass().toString(), e.getMessage());
                }
            }
            //Get handler that will be used to post to main thread
            Handler mainHandler = new Handler(context.getMainLooper());
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    finishListener.onFinishScan(result);
                }
            };
            mainHandler.post(myRunnable);
        }
    };

    Thread myThread = new Thread(runnable);
    myThread.start();

}


}

解决方案

As far as I can see it, your Context is null. You have a private variable Context at the top of your class, but you never assign anything to it, so it's null.

Give your AccessPoint a constructor and put something like

context = getContext();

inside of it.

这篇关于尝试在空对象引用上调用虚拟方法“android.os.Looper android.content.Context.getMainLooper()"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆