我正在执行我的论文,我正在开发一个ANdroid应用程序来配置物联网家用设备(wifi)。在这种情况下,使用Rspberry Pi 3模拟设备,Rspberry Pi 3创建具有已知名称的Access POint(强制门户,无密码),即AutoDevAP-NameOfDevice。我的应用程序显示了智能手机系列中现有的SSID,并允许用户选择其中一个SSID并进行连接(在这种情况下,应用程序仅用于连接此类型的SSID。问题是:在用户选择要连接的SSID(AutoDevAP-SmartSwitch)之后,我开始另一个活动来连接到这个ssid,但是因为智能手机永远不会连接到它而我被卡住了#&# 39; m使用我用来开发应用程序的相同逻辑,总是连接到相同的SSID,没有密码,但它不能工作。最初我教过问题是适配器监听器,但是我&# 39;已经调试过代码并且不是那个问题。 它正在接受Lollipop的测试
我的代码:MainActivity.java
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.ToggleButton;
import java.util.List;
public class MainActivity extends Activity {
WifiManager wifiManager;
private BroadcastReceiver wifiReciever;
private ArrayAdapter adapter;
ListView listview ;
private String nameOfDev;
private Handler mainHandler;
private Thread connectAPThread;
static String info = null;
static String ssidInfo;
static String devName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview= (ListView) findViewById(R.id.listView);
adapter = new ArrayAdapter
(this,android.R.layout.simple_list_item_1);
listview.setAdapter(adapter);
wifiManager = (WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);
mainHandler = new Handler(this.getMainLooper());
wifiReciever = new WiFiScanReceiver();
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String s = listview.getItemAtPosition(i).toString();
info =s;
Toast.makeText(getApplicationContext(), info, Toast.LENGTH_LONG).show();
ssidInfo= getSSIDInfo(info);
Toast.makeText(getApplicationContext(), ssidInfo, Toast.LENGTH_SHORT).show();
devName=getDeviceName(info);
Toast.makeText(getApplicationContext(), devName, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,ConnectWifiActivity.class);
intent.putExtra("ssid",ssidInfo);
intent.putExtra("devName",devName);
startActivity(intent);
}
});
}
public String getSSIDInfo(String s){
String[] things = s.split(",");
String[] cenas = things[0].split(":");
String ssid = cenas[1];
// Toast.makeText(getApplicationContext(), ssid, Toast.LENGTH_LONG).show();
// Toast.makeText(getApplicationContext(), nameOfDev, Toast.LENGTH_LONG).show();
return ssid;
}
public String getDeviceName(String s){
String[] things = s.split(",");
String[] cenas = things[0].split(":");
String ssid = cenas[1];
// Toast.makeText(getApplicationContext(), ssid, Toast.LENGTH_LONG).show();
String[] outras = ssid.split("-");
String nameOfDev = outras[1];
// Toast.makeText(getApplicationContext(), nameOfDev, Toast.LENGTH_LONG).show();
return nameOfDev;
}
public void onToggleClicked(View view) {
adapter.clear();
ToggleButton toggleButton = (ToggleButton) view;
if (wifiManager == null) {
// Device does not support Wi-Fi
Toast.makeText(getApplicationContext(), "Oop! Your device does not support Wi-Fi",
Toast.LENGTH_SHORT).show();
toggleButton.setChecked(false);
} else {
if (toggleButton.isChecked()) { // To turn on Wi-Fi
Toast.makeText(getApplicationContext(), "Wi-Fi is turning on." +
"\n" + "Scanning for access points...",
Toast.LENGTH_SHORT).show();
wifiManager.setWifiEnabled(true);
Toast.makeText(getApplicationContext(), "Wi-Fi is already turned on." +
"\n" + "Scanning for access points...",
Toast.LENGTH_SHORT).show();
wifiManager.startScan();
} else { // To turn off Wi-Fi
Toast.makeText(getApplicationContext(), "Wi-Fi is turned off.",
Toast.LENGTH_SHORT).show();
wifiManager.setWifiEnabled(false);
}
}
}
protected void onResume() {
super.onResume();
// Register the BroadcastReceiver for SCAN_RESULTS_AVAILABLE_ACTION
IntentFilter filter = new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiReciever, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(wifiReciever);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.wi_fi, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
class WiFiScanReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
List<ScanResult> wifiScanResultList = wifiManager.getScanResults();
for(int i = 0; i < wifiScanResultList.size(); i++){
String hotspot = (wifiScanResultList.get(i)).toString();
adapter.add(hotspot);
}
}
}
}
}
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="bernardo.autodevconfiguration.MainActivity">
<ToggleButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/toggleButton"
android:textOn="Wi-Fi On"
android:textOff="Wi-Fi Off"
android:onClick="onToggleClicked"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_centerHorizontal="true"
android:layout_below="@+id/toggleButton" />
</RelativeLayout>
ConnectWifiACtivity.java
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import java.util.List;
/**
* Created by bernardo on 19-03-2017.
*/
public class ConnectWifiActivity extends Activity {
private WifiManager wifiManager;
private Handler mainHandler;
private String ssid;
private String devName;
private Button connectButton;
private Thread wifiThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connctwifi);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
Intent intent = getIntent();
ssid= intent.getStringExtra("ssid");
devName=intent.getStringExtra("devName");
connectButton = (Button)findViewById(R.id.connect);
connectButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//connectToAP();
wifiThread = new Thread(runnable, "turn-on wifi");
wifiThread.start();
}
});
mainHandler = new Handler(this.getMainLooper());
}
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (wifiManager.isWifiEnabled()) {
Log.d("State", "wifi-on");
WifiConfiguration wfc = new WifiConfiguration();
wfc.SSID = "\"".concat(ssid).concat("\"");
wfc.status = WifiConfiguration.Status.DISABLED;
wfc.priority = 40;
wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wfc.allowedAuthAlgorithms.clear();
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
int networkId = wifiManager.addNetwork(wfc);
if (networkId != -1) {
// success, can call wfMgr.enableNetwork(networkId, true) to connect
wifiManager.enableNetwork(networkId, true);
}
} else {
Log.d("not connected", "trying to connect");
Log.d("State", "set wifi on");
wifiManager.setWifiEnabled(true);
WifiConfiguration wfc = new WifiConfiguration();
wfc.SSID = "\"".concat(ssid).concat("\"");
wfc.status = WifiConfiguration.Status.DISABLED;
wfc.priority = 40;
wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wfc.allowedAuthAlgorithms.clear();
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
int networkId = wifiManager.addNetwork(wfc);
if (networkId != -1) {
// success, can call wfMgr.enableNetwork(networkId, true) to connect
wifiManager.enableNetwork(networkId, true);
}
}
}
}
};
}
activity_connctwifi.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="bernardo.autodevconfiguration.ConnectWifiActivity">
<Button
android:text="Connect to your device"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/connect"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="109dp"
android:onClick="selfDestruct"/>
</RelativeLayout>
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="bernardo.autodevconfiguration">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<!--<action android:name="android.net.wifi.STATE_CHANGE" />-->
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="bernardo.autodevconfiguration.ConnectWifiActivity">