Java 如何从后端android服务获取可用的wifi列表?

Java 如何从后端android服务获取可用的wifi列表?,java,android,Java,Android,我正在开发一个android应用程序,它需要定期检查可用的wifi列表,即使该应用程序在后台被删除。所以我正在考虑使用一个服务从后端检查它。在这种情况下,我面临一些问题,以获得可用的wifi列表从服务。我在互联网上搜索,发现大多数解决方案仅用于活动。虽然我试过了,但没用 请注意。当我在直接活动中使用它们时,同样的代码也会起作用。但它在服务类中不起作用 我的服务代码是 package com.example.sodrulaminshaon.ringmodecontroller; import

我正在开发一个android应用程序,它需要定期检查可用的wifi列表,即使该应用程序在后台被删除。所以我正在考虑使用一个服务从后端检查它。在这种情况下,我面临一些问题,以获得可用的wifi列表从服务。我在互联网上搜索,发现大多数解决方案仅用于活动。虽然我试过了,但没用

请注意。当我在直接活动中使用它们时,同样的代码也会起作用。但它在服务类中不起作用

我的服务代码是

package com.example.sodrulaminshaon.ringmodecontroller;


import android.Manifest;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.support.v4.content.ContextCompat;
import android.util.Log;

import java.util.List;
import java.util.Set;

/**
 * Created by Sodrul Amin Shaon on 22-Jun-18.
 */

public class MyService extends Service {
WifiManager wifiManager;
WifiReceiver receiverWifi;
private static final String LIST_TESTING = "ListTest";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    SharedPreferences preferences = getSharedPreferences(Constants.PREFERENCE_NAME,MODE_PRIVATE);
    boolean auto = preferences.getBoolean(Constants.AUTO_CONTROL_STR,false);
    //if(MainActivity.getAutoControl())
    if(auto)
    {
        wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
        if (!wifiManager.isWifiEnabled())
        {
            wifiManager.setWifiEnabled(true);
        }
        Log.i(LIST_TESTING,"Wifi is enabled. Now going to check the available list.");
        receiverWifi = new WifiReceiver();
        registerReceiver(receiverWifi,
                new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
        wifiManager.startScan();
    }
    stopSelf();
    return START_STICKY;
}

class WifiReceiver extends BroadcastReceiver {

    // This method call when number of wifi connections changed
    public void onReceive(Context c, Intent intent) {

        StringBuilder sb = new StringBuilder();
        List<ScanResult> wifiList = wifiManager.getScanResults();
        Log.i(LIST_TESTING,"Inside scan result receiver. Scan result size: "+wifiList.size());
        sb.append("\n        Number Of Wifi connections :"+wifiList.size()+"\n\n");

        for(int i = 0; i < wifiList.size(); i++){

            sb.append(new Integer(i+1).toString() + ". ");
            sb.append(wifiList.get(i).SSID).toString();
            sb.append("\n\n");
        }
        Log.i(LIST_TESTING,sb.toString());
    }


}
@Override
public IBinder onBind(Intent intent) {
    return null;
}
@Override
public void onDestroy() {
    // I want to restart this service again in one hour
    SharedPreferences preferences = getSharedPreferences(Constants.PREFERENCE_NAME,MODE_PRIVATE);
    boolean auto = preferences.getBoolean(Constants.AUTO_CONTROL_STR,false);
    if(auto)
    {
        if(wifiManager.isWifiEnabled())unregisterReceiver(receiverWifi);
        AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarm.set(
                alarm.RTC_WAKEUP,
                System.currentTimeMillis() + (1000 * 10),
                PendingIntent.getService(this, 0, new Intent(this, MyService.class), 0)
        );
    }
}
这条线正在连续打印。但是另外两行呢

Log.i(LIST_TESTING,"Inside scan result receiver. Scan result size: "+wifiList.size());
Log.i(LIST_TESTING,sb.toString());

没有被执行。任何人都可以帮助我……

你应该创建一个广播接收器来获取可用wifi网络的列表

private final BroadcastReceiver mWifiScanReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context c, Intent intent) {
            if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
                List<ScanResult> mScanResults = mWifiManager.getScanResults();

            }
        }
    }

有关更多详细信息,此问题与此相关。

因为没有人回答。我进一步尝试,发现我的代码有问题。在我的代码中,我调用了
stopSelf()
在…内

public int-onstart命令(Intent-Intent、int-flags、int-startId)
method。这导致我的服务在启动后立即停止。这意味着我注册的
broadCastReceiver
也被丢弃。因此,未打印wifi列表。我写这段代码并发现错误是愚蠢的。

当您没有工作代码时,请提交一个。我们不知道你读过什么,你尝试过什么,以及为什么不起作用。因此,请不要期望我们重复以前写下的内容。你也应该花一些时间在课堂上学习如何/问什么。不是这样的,嗨。谢谢你的建议。我已经编辑了我的问题。请现在检查一下,看你是否能帮我。由于您已将此问题标记为重复,我向您保证此代码在活动中运行得非常好。但不是在服役。你好,先生。如果您检查我的代码,我已经添加了该部分。我看过这篇文章,你已经链接了很多次,它只在我已经提到的活动中起作用。非常感谢。
Log.i(LIST_TESTING,"Inside scan result receiver. Scan result size: "+wifiList.size());
Log.i(LIST_TESTING,sb.toString());
private final BroadcastReceiver mWifiScanReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context c, Intent intent) {
            if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
                List<ScanResult> mScanResults = mWifiManager.getScanResults();

            }
        }
    }
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
registerReceiver(mWifiScanReceiver,
        new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
mWifiManager.startScan();