棉花糖wifi扫描并连接不起作用



我正在尝试扫描可用的Wi-Fi网络以获取网络列表,并选择要连接的特定网络。它在Lollipop上工作,但在棉花糖上不工作。根据此和这个博客,几乎没有更改,但我没有得到如何实施这些更改。

当前在棉花糖中,应用程序仅连接到由应用程序创建的那些网络。当我尝试连接到其他网络时,应用程序会崩溃。

这是我的活动代码:

import android.Manifest;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;

public class CustomWifiListAcivity extends AppCompatActivity {
    private TextView mainText;
    private ListView wifiDeviceList;
    private WifiManager mainWifi;
    private CustomWifiListAcivity.WifiReceiver receiverWifi;
    private List<ScanResult> wifiList;
    private StringBuilder sb;
    private String ssid_selected=null;
    private Context context=null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wifi_list);
        context=getApplicationContext();
        setTitle("Choose Switchbox");
        wifiDeviceList=(ListView)findViewById(R.id.listView);
        mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if (!mainWifi.isWifiEnabled())
        {
            Toast.makeText(getApplicationContext(), "Turning WiFi ON...", Toast.LENGTH_LONG).show();
            mainWifi.setWifiEnabled(true);
        }
        wifiDeviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                final String ssid = '"' + wifiList.get(position).SSID + '"';
                final String mac = wifiList.get(position).BSSID;
                String pass = "";

                LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
                View promptView = inflater.inflate(R.layout.dialog_wifi, null);
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(CustomWifiListAcivity.this);
                alertDialogBuilder.setView(promptView);
                final EditText ssid_et = (EditText) promptView.findViewById(R.id.editText_ssid);
                final EditText pass_et = (EditText) promptView.findViewById(R.id.editText_pswd);
                ssid_et.setText(wifiList.get(position).SSID);
                alertDialogBuilder
                        .setCancelable(true)
                        .setPositiveButton("Connect", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                String ssid = '"' + wifiList.get(position).SSID + '"';
                                String password = '"' + pass_et.getText().toString() + '"';
                                System.out.println("ssid: "+ssid);
                                System.out.println("password: "+password);
                                connectToHost(getApplicationContext(),ssid,password);
                            }
                        })
                        .setNegativeButton("Cancel",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                })
                        .create()
                        .show();
            }
        });
    }
    public void connectToHost(Context context,String host,String password){
        mainWifi  = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiConfiguration wc=new WifiConfiguration();
        wc.SSID= host;
        wc.preSharedKey =  password;;
        wc.status = WifiConfiguration.Status.ENABLED;
        wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
        wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA
        wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2
        wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
        wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
        wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
        wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
        wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
        wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

        int netId=mainWifi.addNetwork(wc);
        try {
            mainWifi.enableNetwork(netId, true);
            mainWifi.setWifiEnabled(true);
            System.out.println("enabled network");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
    class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
            String action = intent.getAction();
            if(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)){
                sb = new StringBuilder();
                wifiList = mainWifi.getScanResults();
                sb.append("n        Number Of Wifi connections :"+wifiList.size()+"nn");
                ArrayList<String> deviceList = new ArrayList<String>();
                for(int i = 0; i < wifiList.size(); i++){
                    sb.append(new Integer(i+1).toString() + ". ");
                    sb.append((wifiList.get(i)).toString());
                    sb.append("nn");
                    deviceList.add(wifiList.get(i).SSID);
                }

                ArrayAdapter arrayAdapter = new ArrayAdapter(CustomWifiListAcivity.this,
                        android.R.layout.simple_list_item_1, deviceList.toArray());
                wifiDeviceList.setAdapter(arrayAdapter);
            }
        }
    }
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiverWifi);
    }
    @Override
    protected void onPostResume() {
        super.onPostResume();
        receiverWifi = new CustomWifiListAcivity.WifiReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(receiverWifi, intentFilter);
        getWifi();
    }
    private void getWifi() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Toast.makeText(CustomWifiListAcivity.this, "version>=marshmallow", Toast.LENGTH_SHORT).show();

            if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(CustomWifiListAcivity.this, "location turned off", Toast.LENGTH_SHORT).show();
                requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            }
            else{
                Toast.makeText(CustomWifiListAcivity.this, "location turned on", Toast.LENGTH_SHORT).show();
                mainWifi.startScan();
            }
        }else {
            Toast.makeText(CustomWifiListAcivity.this, "scanning", Toast.LENGTH_SHORT).show();
            mainWifi.startScan();
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == 1) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(CustomWifiListAcivity.this, "permission granted", Toast.LENGTH_SHORT).show();  mainWifi.startScan();
            }else{
                Toast.makeText(CustomWifiListAcivity.this, "permission not granted", Toast.LENGTH_SHORT).show();
                return;
            }

        }
    }
}

这是清单文件的权限

   <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

我已经设法解决了问题。以下代码在棉花糖上工作。在棉花糖中不允许重新配置以前配置的网络。

import android.Manifest;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;

public class CustomWifiListAcivity extends AppCompatActivity {
    private TextView mainText;
    private ListView wifiDeviceList;
    private WifiManager mainWifi;
    private CustomWifiListAcivity.WifiReceiver receiverWifi;
    private List<ScanResult> wifiList;
    private StringBuilder sb;
    private String ssid_selected=null;
    private Context context=null;
    private static final int MY_PERMISSIONS_REQUEST =1 ;
    Button connect_btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wifi_list);
        context=getApplicationContext();
        setTitle("Choose Switchbox");
        connect_btn=(Button) findViewById(R.id.connect_btn);
        wifiDeviceList=(ListView)findViewById(R.id.listView);
        mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if (!mainWifi.isWifiEnabled())
        {
            Toast.makeText(getApplicationContext(), "Turning WiFi ON...", Toast.LENGTH_LONG).show();
            mainWifi.setWifiEnabled(true);
        }
       wifiDeviceList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {
                final String ssid = '"' + wifiList.get(position).SSID + '"';
                final String mac = wifiList.get(position).BSSID;
                String pass = "";

                LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
                View promptView = inflater.inflate(R.layout.dialog_wifi, null);
                AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(CustomWifiListAcivity.this);
                alertDialogBuilder.setView(promptView);
                final EditText ssid_et = (EditText) promptView.findViewById(R.id.editText_ssid);
                final EditText pass_et = (EditText) promptView.findViewById(R.id.editText_pswd);
                ssid_et.setText(wifiList.get(position).SSID);
                alertDialogBuilder
                        .setCancelable(true)
                        .setPositiveButton("Connect", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                String ssid = '"' + wifiList.get(position).SSID + '"';
                                String password = '"' + pass_et.getText().toString() + '"';
                                System.out.println("ssid: "+ssid);
                                System.out.println("password: "+password);
                                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                    connectToHost(getApplicationContext(), ssid, password);
                                }
                                else{
                                    connectToHost2(getApplicationContext(), ssid, password);
                                }
                            }
                        })
                        .setNegativeButton("Cancel",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                })
                        .create()
                        .show();
            }
        });
    }

    public void connectToHost(Context context,String host,String password){
        mainWifi  = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiConfiguration wc=new WifiConfiguration();
        wc.SSID= host;
        wc.preSharedKey =  password;
        int netId=mainWifi.addNetwork(wc);

        try {
            mainWifi.enableNetwork(netId, true);
            mainWifi.setWifiEnabled(true);
            System.out.println("enabled network");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }

    public void connectToHost2(Context context,String host,String password){
        mainWifi  = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        WifiConfiguration wc=new WifiConfiguration();
        wc.SSID= host;
        wc.preSharedKey =  password;
            wc.status = WifiConfiguration.Status.ENABLED;
            wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
            wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA); // For WPA
            wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); // For WPA2
            wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
            wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
            wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
            wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
            wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

        int netId=mainWifi.addNetwork(wc);

        try {
            mainWifi.enableNetwork(netId, true);
            mainWifi.setWifiEnabled(true);
            System.out.println("enabled network");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
    class WifiReceiver extends BroadcastReceiver {
        public void onReceive(Context c, Intent intent) {
            String action = intent.getAction();
            if(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)){
                sb = new StringBuilder();
                wifiList = mainWifi.getScanResults();
                sb.append("n Number Of Wifi connections :"+wifiList.size()+"nn");
                ArrayList<String> deviceList = new ArrayList<String>();
                for(int i = 0; i < wifiList.size(); i++){
                    sb.append(new Integer(i+1).toString() + ". ");
                    sb.append((wifiList.get(i)).toString());
                    sb.append("nn");
                    deviceList.add(wifiList.get(i).SSID);
                }
                ArrayAdapter arrayAdapter = new ArrayAdapter(CustomWifiListAcivity.this,
                        android.R.layout.simple_list_item_1, deviceList.toArray());
                wifiDeviceList.setAdapter(arrayAdapter);
            }
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(receiverWifi);
    }
    @Override
    protected void onPostResume() {
        super.onPostResume();
        receiverWifi = new CustomWifiListAcivity.WifiReceiver();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(receiverWifi, intentFilter);
        getWifi();
    }
    private void getWifi() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Toast.makeText(CustomWifiListAcivity.this, "version>=marshmallow", Toast.LENGTH_SHORT).show();
            if (ContextCompat.checkSelfPermission(CustomWifiListAcivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(CustomWifiListAcivity.this, "location turned off", Toast.LENGTH_SHORT).show();
                ActivityCompat.requestPermissions(CustomWifiListAcivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, MY_PERMISSIONS_REQUEST);
            }
            else{
                Toast.makeText(CustomWifiListAcivity.this, "location turned on", Toast.LENGTH_SHORT).show();
                mainWifi.startScan();
            }
        }else {
            Toast.makeText(CustomWifiListAcivity.this, "scanning", Toast.LENGTH_SHORT).show();
            mainWifi.startScan();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == MY_PERMISSIONS_REQUEST) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(CustomWifiListAcivity.this, "permission granted", Toast.LENGTH_SHORT).show();
                mainWifi.startScan();
            }else{
                Toast.makeText(CustomWifiListAcivity.this, "permission not granted", Toast.LENGTH_SHORT).show();
                return;
            }
        }
    }
}

ConnectToHost()方法用于棉花糖。ConnectToHost2()方法用于棉花糖下方的设备。

最新更新