2014-09-10 20 views
6

Sto cercando di accendere il portatile WiFi Hotspot ON, facendo riferimento questo link:.
how to set advanced settings of android wifihotspotAndroid: programmazione Accendere hotspot WiFi

Questo sta lavorando bene sul Samsung Galaxy S3 Android v4.4.2 (nessun problema)
Ma su altri dispositivi con la versione Android uguale o inferiore, l'applicazione si blocca e riavvia il dispositivo.

Il codice è il seguente:

package com.android.startwifi; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

import android.app.Activity; 
import android.content.Context; 
import android.net.wifi.WifiConfiguration; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 


public class Main extends Activity { 

public WifiManager wifiManager; 
public Context context; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Log.i("hi1","hi"); 
    createWifiAccessPoint(); 
} 
private void createWifiAccessPoint() { 
    WifiManager wifiManager = (WifiManager)getBaseContext().getSystemService(Context.WIFI_SERVICE); 
    if(wifiManager.isWifiEnabled()) 
    { 
     wifiManager.setWifiEnabled(false);   
    }  
    Method[] wmMethods = wifiManager.getClass().getDeclaredMethods(); 
    boolean methodFound=false; 
    for(Method method: wmMethods){ 
     if(method.getName().equals("setWifiApEnabled")){ 
      methodFound=true; 
      WifiConfiguration netConfig = new WifiConfiguration(); 
      netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
      netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
      netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
      netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
      netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
      netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
      netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
      netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
      try { 
       boolean apstatus=(Boolean) method.invoke(wifiManager, netConfig,true);   
       //statusView.setText("Creating a Wi-Fi Network \""+netConfig.SSID+"\""); 
       for (Method isWifiApEnabledmethod: wmMethods) 
       { 
        if(isWifiApEnabledmethod.getName().equals("isWifiApEnabled")){ 
         while(!(Boolean)isWifiApEnabledmethod.invoke(wifiManager)){ 
         }; 
         for(Method method1: wmMethods){ 
          if(method1.getName().equals("getWifiApState")){ 
           int apstate; 
           apstate=(Integer)method1.invoke(wifiManager); 
           //     netConfig=(WifiConfiguration)method1.invoke(wifi); 
           //statusView.append("\nSSID:"+netConfig.SSID+"\nPassword:"+netConfig.preSharedKey+"\n"); 
          } 
         } 
        } 
       } 
       if(apstatus) 
       { 
        System.out.println("SUCCESSdddd"); 
        //statusView.append("\nAccess Point Created!"); 
        //finish(); 
        //Intent searchSensorsIntent = new Intent(this,SearchSensors.class);    
        //startActivity(searchSensorsIntent); 
       }else 
       { 
        System.out.println("FAILED"); 
        //statusView.append("\nAccess Point Creation failed!"); 
       } 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 
     }  
    } 
    if(!methodFound){ 
     //statusView.setText("Your phone's API does not contain setWifiApEnabled method to configure an access point"); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, 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); 
} 
} 


Le autorizzazioni che ho definito nel file manifesto sono:

<uses-permission android:name="android.permission.INTERNET"/> 
<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"/> 


Il file di log generato è il seguente :

09-10 18:35:01.644: D/jdwp(29752): prepping for JDWP over ADB 
09-10 18:35:01.644: D/jdwp(29752): ADB transport startup 
09-10 18:35:01.644: D/dalvikvm(29752): Elevating priority from 0 to -8 
09-10 18:35:01.645: D/jdwp(29752): JDWP: thread running 
09-10 18:35:01.645: D/jdwp(29752): acceptConnection 
09-10 18:35:01.646: D/jdwp(29752): trying to receive file descriptor from ADB 
09-10 18:35:01.646: D/dalvikvm(29752): zygote get thread init done 
09-10 18:35:01.653: D/jdwp(29752): received file descriptor 34 from ADB 
09-10 18:35:01.658: D/jdwp(29752): processIncoming 
09-10 18:35:01.659: D/jdwp(29752): processIncoming 
09-10 18:35:01.659: D/jdwp(29752): handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x40000040, flags=0x0, dataLen=0x8 
09-10 18:35:01.661: D/jdwp(29752): processIncoming 
09-10 18:35:01.661: D/jdwp(29752): handlePacket : cmd=0x1, cmdSet=0xC7, len=0x17, id=0x40000041, flags=0x0, dataLen=0xC 
09-10 18:35:01.663: D/jdwp(29752): processIncoming 
09-10 18:35:01.663: D/jdwp(29752): handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x40000042, flags=0x0, dataLen=0x8 
09-10 18:35:01.665: D/jdwp(29752): processIncoming 
09-10 18:35:01.665: D/jdwp(29752): handlePacket : cmd=0x1, cmdSet=0xC7, len=0x13, id=0x40000043, flags=0x0, dataLen=0x8 
09-10 18:35:01.676: D/jdwp(29752): sendBufferedRequest : len=0x3D 
09-10 18:35:01.736: D/jdwp(29752): sendBufferedRequest : len=0x45 
09-10 18:35:01.754: W/asset(29752): AssetManager-->addDefaultAssets CIP path not exsit! 
09-10 18:35:02.219: I/hi1(29752): hi 
09-10 18:35:02.261: D/WifiManager(29752): Enter init, sThreadRefCount:0 
09-10 18:35:02.268: D/WifiManager(29752): Create WifiManager handlerthread 
09-10 18:35:03.599: I/System.out(29752): SUCCESSdddd 
09-10 18:35:03.634: V/PhoneWindow(29752): DecorView setVisiblity: visibility = 4 
09-10 18:35:03.745: V/PhoneWindow(29752): DecorView setVisiblity: visibility = 0 
09-10 18:35:03.922: D/libEGL(29752): loaded /system/lib/egl/libEGL_mali.so 
09-10 18:35:03.924: D/libEGL(29752): loaded /system/lib/egl/libGLESv1_CM_mali.so 
09-10 18:35:03.927: D/libEGL(29752): loaded /system/lib/egl/libGLESv2_mali.so 
09-10 18:35:04.111: D/OpenGLRenderer(29752): Enabling debug mode 0 
09-10 18:35:10.610: E/InputEventReceiver(29752): channel '41f21f48 com.android.startwifi/com.android.startwifi.Main (client)' ~ Publisher closed input channel or an error occurred. events=0x9 


Così ho le seguenti domande:

  • Vorrei sapere perché è questa applicazione comporta normalmente Samsung S3 ma non su altri dispositivi?
  • Come posso risolvere questo problema?
+0

controllare questo http://stackoverflow.com/questions/6394599/android-turn-on-off-wifi-hotspot-programmatically – Gattsu

+0

Mi trovo di fronte a una domanda simile. Il tuo codice disattiva il wifi per me. Ma non poteva avviare l'hotspot. Sei riuscito a risolvere il problema? –

risposta

3

Ho avuto lo stesso problema. È necessario cancellare la seguente riga di codice:

netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);  

Questo funziona per me nelle versioni 4.1.1, 4.2 e 4.3.

0

Prova questo test codice .Io in Android 5.0.1:

 public boolean setHotSpot(String SSID,String passWord){ 
     Method[] mMethods = mWifiManager.getClass().getDeclaredMethods(); 

     for(Method mMethod: mMethods){ 

      if(mMethod.getName().equals("setWifiApEnabled")) { 
       WifiConfiguration netConfig = new WifiConfiguration(); 
       if(passWord==""){ 
        netConfig.SSID = SSID; 
        netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
        netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
        netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
        netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);  
       }else{ 
       netConfig.SSID = SSID ; 
       netConfig.preSharedKey = passWord; 
       netConfig.hiddenSSID = true; 
       netConfig.status = WifiConfiguration.Status.ENABLED; 
       netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
       netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
       netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
       netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
       netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
       netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
       netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
       } 
       try {    
        mMethod.invoke(mWifiManager, netConfig,false); 
        mWifiManager.saveConfiguration(); 
        return true; 

       } catch (Exception e) { 
        e.getMessage(); 
       } 
      } 
     } 
     return false; 
    } 

Inserire questa autorizzazione in AndroidManifest:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
5
WifiConfiguration netConfig = new WifiConfiguration(); 

netConfig.SSID = "MyAP"; 
netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 

try { 
    Method setWifiApMethod = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); 
    boolean apstatus=(Boolean) setWifiApMethod.invoke(wifiManager, netConfig,true); 

    Method isWifiApEnabledmethod = wifiManager.getClass().getMethod("isWifiApEnabled"); 
    while(!(Boolean)isWifiApEnabledmethod.invoke(wifiManager)){}; 
    Method getWifiApStateMethod = wifiManager.getClass().getMethod("getWifiApState"); 
    int apstate=(Integer)getWifiApStateMethod.invoke(wifiManager); 
    Method getWifiApConfigurationMethod = wifiManager.getClass().getMethod("getWifiApConfiguration"); 
    netConfig=(WifiConfiguration)getWifiApConfigurationMethod.invoke(wifiManager); 
    Log.e("CLIENT", "\nSSID:"+netConfig.SSID+"\nPassword:"+netConfig.preSharedKey+"\n"); 
} catch (Exception e) { 
    Log.e(this.getClass().toString(), "", e); 
} 
+0

Funziona alla grande !!!, testato nei dispositivi con 4.1.2, 4.4, 5.0.1 –

+0

Grazie Funziona bene per me .... –

0

Se si utilizza l'autenticazione WPA_PSK, è necessario specificare chiave condivisa in precedenza.

 netConfig.preSharedKey = "testPassword"; 
     netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 

Altrimenti si arresta e riavvia il dispositivo.