1

私のAndroidアプリケーションでは、アプリケーションのライフサイクル全体でアクティブなままにしておく必要がある何らかの目的のために、アプリケーションのロード時にホットスポット(アクセスポイント)を作成しています(コードは以下に示されています)(いくつかの欠点があることはわかっています)。 、どうすればそれがずっとアクティブなままであることを確認できますか? 私が持っている唯一のアイデアは、method.getName().equals("setWifiApEnabled") ステータスをチェックし、非アクティブかどうかを判断するタイマーを実行することですか? AP が無効になっていることを示す良い方法はありますか?

  IntentFilter filter = new IntentFilter();
    filter.addAction(WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION);
    filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
    filter.addAction(WifiManager.EXTRA_NEW_STATE);
    filter.addAction(WifiManager.EXTRA_SUPPLICANT_CONNECTED);
    registerReceiver(wifiEventReceiver, filter);

 private BroadcastReceiver wifiEventReceiver = new BroadcastReceiver() {
    private boolean enabled = false;

    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println ("WiFi Event BroadReceiver:onReceive()=======================================");
        if(intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) {
            System.out.println("===== SUPPLICANT_STATE_CHANGE_ACTION event happened....");
            intent.getBooleanExtra(WifiManager.EXTRA_SUPPLICANT_CONNECTED, false);
        }
    }
};
 private void createWifiAccessPoint() {
    if(wifiManager.isWifiEnabled())
    {
        wifiManager.setWifiEnabled(false);          
    }       
    Method[] wmMethods = wifiManager.getClass().getDeclaredMethods();   //Get all declared methods in WifiManager class     
    boolean methodFound=false;
    for(Method method: wmMethods){
        if(method.getName().equals("setWifiApEnabled")){
            methodFound=true;
            WifiConfiguration netConfig = new WifiConfiguration();
            netConfig.SSID = ssid; 
            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", "Your phone's API does not contain setWifiApEnabled method to configure an access point");
    }
}        
4

3 に答える 3

0

BroadcastReceiverインテントSUPPLICANT_STATE_CHANGED_ACTIONまたはSUPPLICANT_CONNECTION_CHANGE_ACTIONを登録する必要があるようです

受信者の登録について知っていると思います。

于 2011-04-29T08:53:17.147 に答える
0

WiFi 接続を保証することは不可能であるため、ここで何を達成しようとしているのかは明確ではありません。失われた場合にできる最善のことは、「優雅に」失敗することです。

WiFi ネットワークの状態を監視するには、 NETWORK_STATE_CHANGED_ACTIONのリスナーを登録する必要があります。嘆願者の状態は忘れてください。

WiFi 無線を起動状態に保つには、WiFiLockを使用します。

于 2012-05-21T08:31:43.430 に答える