1

アクティビティを開始するために利用可能な最強の Wi-Fi をスキャンして、建物内の現在の場所を特定する必要があります。その建物内の 3 か所だけを特定したい。そのため、現在これらの場所の近くにいる場合は、ボタンをクリックして利用可能な最も強力な Wifi をスキャンし、アクティビティを開始します。

  1. 建物内で利用可能な Wi-Fi をスキャンする必要があります。
  2. 3 つの最強の信号を取得します。
  3. 次に、これら 3 つの最も強い信号の SSID のいずれかが、特定したい特定の SSID と同じかどうかを検出します。
  4. 私の SSID が最も強い 3 つの信号の 1 つである場合、アプリケーションは xml レイアウト アクティビティを起動します。

これまでのところ、利用可能な最強の Wi-Fi をスキャンするためのコーディングを既に行っています。しかし、最も強力な特定の Wifi SSID が検出されたときにアクティビティを開始する方法がわかりません。自分の情報を含むアクティビティ レイアウトを起動するためだけに、Wifi に関する情報は必要ありません。

現時点では、次のコードを使用して、ここから取得した最強の Wifi 信号をスキャンしています。

WiFiDemo.java

public class WiFiDemo extends Activity implements OnClickListener {
private static final String TAG = "WiFiDemo";
WifiManager wifi;
BroadcastReceiver receiver;

TextView textStatus;
Button buttonScan;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Setup UI
    textStatus = (TextView) findViewById(R.id.textStatus);
    buttonScan = (Button) findViewById(R.id.buttonScan);
    buttonScan.setOnClickListener(this);

    // Setup WiFi
    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    // Get WiFi status
    WifiInfo info = wifi.getConnectionInfo();
    textStatus.append("\n\nWiFi Status: " + info.toString());

    // List available networks
    List<WifiConfiguration> configs = wifi.getConfiguredNetworks();
    for (WifiConfiguration config : configs) {
        textStatus.append("\n\n" + config.toString());
    }

    // Register Broadcast Receiver
    if (receiver == null)
        receiver = new WiFiScanReceiver(this);

    registerReceiver(receiver, new IntentFilter(
            WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    Log.d(TAG, "onCreate()");
}

@Override
public void onStop() {
    unregisterReceiver(receiver);
}

public void onClick(View view) {
    Toast.makeText(this, "On Click Clicked. Toast to that!!!",
            Toast.LENGTH_LONG).show();

    if (view.getId() == R.id.buttonScan) {
        Log.d(TAG, "onClick() wifi.startScan()");
        wifi.startScan();
    }
} }

WiFiScanReceiver.java

      public class WiFiScanReceiver extends BroadcastReceiver {
        private static final String TAG = "WiFiScanReceiver";
        WiFiDemo wifiDemo;

      public WiFiScanReceiver(WiFiDemo wifiDemo) {
        super();
        this.wifiDemo = wifiDemo;
      }

      @Override
      public void onReceive(Context c, Intent intent) {
        List<ScanResult> results = wifiDemo.wifi.getScanResults();
        ScanResult bestSignal = null;
        for (ScanResult result : results) {
          if (bestSignal == null
              || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0)
            bestSignal = result;
        }

        String message = String.format("%s networks found. %s is the strongest.",
            results.size(), bestSignal.SSID);
        Toast.makeText(wifiDemo, message, Toast.LENGTH_LONG).show();

        Log.d(TAG, "onReceive() message: " + message);
      }

    }
4

1 に答える 1

0

onReceive からアクティビティを開始するだけです。私があなたの質問を理解していない場合を除き、アクティビティを開始する必要があります。レシーバーの onReceive にコンテキストがあるため、startActivity() を実行するだけです。

onReceive BroadcastReceiver 内でアクティビティを開始

 @Override
    public void onReceive(Context context, Intent intent) {
        //start activity
        Intent i = new Intent();
        i.setClassName("com.test", "com.test.MainActivity");
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }

マニフェストで適切なフィルターを定義することを忘れないでください。 http://developer.android.com/reference/android/content/BroadcastReceiver.html

于 2012-12-17T22:25:30.343 に答える