2012-10-17 17 views
19

私はアンドロイドデバイス用のアクセスポイントを作成するコードを書いています。私は両方のエミュレータと実際のデバイスでテストしました。しかし、それは動作しません。どこが間違っていたのですか?プログラムでアクセスポイントを作成する方法

public class MainWAP extends Activity { 

    WifiManager wifiManager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_wap); 
    } 

    public void openWifi(View v) { 
     createWifiAccessPoint(); 
    } 

    private void createWifiAccessPoint() { 
     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.SSID = "AccessPoint"; 
       netConfig.allowedAuthAlgorithms.set(
        WifiConfiguration.AuthAlgorithm.OPEN); 
       try { 
        boolean apstatus = (Boolean) method.invoke(
         wifiManager, netConfig, true); 
        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); 
           } 
          } 
         } 
        } 
        if (apstatus) { 
         Log.d("Splash Activity", 
          "Access Point created"); 
        } else { 
         Log.d("Splash Activity", 
          "Access Point creation failed"); 
        } 

       } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } catch (InvocationTargetException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     if (!methodFound) { 
      Log.d("Splash Activity", 
       "cannot configure an access point"); 
     } 
    } 
} 
+0

関連するエラーメッセージが表示されますか?ログメッセージ? – WilHall

+0

これで@ダニエルが解決しましたか?まだ完了していない場合は – gumuruh

+0

です。これをチェックして、あなたを助けてくれることを願ってください:http://omtlab.com/android-check-network-connection-available-using-wifi/ @ダニエル – gumuruh

答えて

0

反射を使用してドキュメント化されていないAPIを悪用する方法では、すべてのシナリオでうまく機能しない場合があります。 これをマニフェストファイルに追加して試してみてください。

android.permission.ACCESS_WIFI_STATE 
android.permission.CHANGE_WIFI_STATE 
android.permission.WRITE_APN_SETTINGS 
+0

私はマニフェストファイルにandroid.permission.CHANGE_WIFI_STATE、android.permission.CHANGE_NETWORK_STATE、android.permission.INTERNET android.permission.ACCESS_NETWORK_STATE、android.hardware.wifi、android.permission.WRITE_APN_SETTINGSを追加しました。しかし、私はエミュレータで実行し、ボタンをクリックすると、ポップアップ強制終了します。 – daniel

+0

ログメッセージには、1)java.lang.reflect.InvocationTargetExceptionに起因するエラー2)java.lang.NullPointerExceptionに起因するエラー2) – daniel

+0

1)java.lang.reflect.InvocationTargetException 27行目で発生したエラー: 'createWifiAccessPoint(); ' 2)33行目でjava.lang.NullPointerExceptionが発生しました:' if(wifiManager.isWifiEnabled()) '@WilHall – daniel

7

WiFiManagerは完全に初期化されていません。あなたはこのコードが動作するようにするためにいくつかのことを必要とする

wifiManager = (WiFiManager) getSystemService(Context.WIFI_SERVICE); 
+0

@Tomこれは彼の質問に対する答えです。彼がWiFiManagerを初期化する場合(そして今は 'null')、すべてうまく動作します(私はちょうどそれをテストしました)。 –

+0

あなたはちょうど事実を述べました。私はあなたがそれが特定の質問にどのように関係しているのか、そして問題を解決するために何をすべきかを説明すべきだと思います。あなたの答えが低品質と自動的に分類された理由があります。 – toniedzwiedz

+0

@Tomかもしれません。私はそれを更新します。 –

3

:あなたのonCreate方法で

はこれを追加します。

1)初期wifiManager onCreate()は:

WifiManager wifiManager = (WiFiManager) getSystemService(Context.WIFI_SERVICE); 

2)あなたはAndroidManifest.xmlにこの権限を依頼する必要があります。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
<uses-permission android:name="android.permission.WRITE_APN_SETTINGS" /> 

3)アプリケーションは、システムの証明書で署名する必要があります。

+3

手順3であなたはどういう意味ですか? –

+0

@FabricioPH彼はそれがシステムアプリケーションである必要があることを意味しました。あなたが 'WRITE_APN_SETTINGS'を使用しようとすると、システムアプリケーションだけがその許可を使用できることを伝えます。 – JediBurrell

関連する問題