Поиск сетей Wi-Fi [дубликат]

Несмотря на то, что принятый anwer присутствует, я хотел бы добавить немного описания.

Давайте сделаем небольшое упражнение

, прежде всего определим класс следующим образом:

class A:
temp='Skyharbor'

def __init__(self, x):
    self.x=x
def change(self, y):
    self.temp=y

Итак, что мы имеем здесь?

  • У нас есть очень простой класс, который имеет атрибут temp, который является строкой
  • An init, который устанавливает self.x
  • . Метод изменения устанавливает self.temp

Довольно прямо вперед до сих пор? Теперь давайте начнем играть с этим классом. Давайте сначала инициализируем этот класс:

a = A('Tesseract')

Теперь сделайте следующее:

>>> print a.temp
Skyharbor
>>> print A.temp
Skyharbor

Ну, a.temp работал так, как ожидалось, но как, черт возьми, A.temp работал? Ну, это сработало, потому что temp - это атрибут класса. Все в python - это объект. Здесь A также является объектом класса type. Таким образом, temp атрибута является атрибутом, принадлежащим классу A, и если вы измените значение temp через A (а не через экземпляр a), измененное значение будет отражено во всем экземпляре класса A. Давайте продолжим и сделаем это:

>>> A.temp = 'Monuments'
>>> print A.temp
Monuments
>>> print a.temp
Monuments

Интересно, не так ли? И обратите внимание, что id (a.temp) и id (A.temp) все те же

Любой объект Python автоматически получает атрибут dict, который содержит его список атрибутов. Давайте рассмотрим, что этот словарь содержит для наших объектов-объектов:

>>> print A.__dict__
{
    'change': <function change at 0x7f5e26fee6e0>,
    '__module__': '__main__',
    '__init__': <function __init__ at 0x7f5e26fee668>,
    'temp': 'Monuments',
    '__doc__': None
}
>>> print a.__dict__
{x: 'Tesseract'}

Обратите внимание, что атрибут temp указан среди атрибутов класса A, тогда как x указан для экземпляра

Итак, что мы получаем определенное значение a.temp, если оно даже не указано для экземпляра a. Ну, это волшебство метода __getattribute__(). В Python точечный синтаксис автоматически вызывает этот метод, поэтому, когда мы пишем a.temp, Python выполняет a.getattribute ('temp'). Этот метод выполняет действие поиска атрибута, то есть находит значение атрибута, просматривая в разных местах.

Стандартная реализация __getattribute__() сначала ищет внутренний словарь (dict) объекта, а затем тип самого объекта. В этом случае a.__getattribute__('temp') выполняет сначала a.__dict__['temp'], а затем a.__class__.__dict__['temp']

Теперь давайте воспользуемся нашим методом change:

>>> a.change('Intervals')
>>> print a.temp
Intervals
>>> print A.temp
Monuments

Ну, теперь, когда мы использовали себя , print a.temp дает другое значение из print A.temp.

Теперь, если мы сравним id (a.temp) и id (A.temp), они будут разными

44
задан Deividi Cavarzan 22 August 2015 в 02:15
поделиться

4 ответа

Начиная с Android 6.0, поведение разрешений изменилось на время выполнения. Чтобы использовать функцию, требующую разрешения, сначала нужно проверить, разрешено ли разрешение. Используя checkSelfPermission(permissionString) метод , возвращается результат, wither ther - PERMISSION_GRANTED или PERMISSION_DENIED.

Если разрешение не предоставлено или это первый раз, запрос для разрешения должно быть сделано. Предоставление пользователю возможности предоставить или запретить.

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
   requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                 PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION);
    //After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method

}else{
    getScanningResults();
   //do something, permission was previously granted; or legacy device
}

Если ваш код работает на устройстве до M, вы продолжаете свой код, разрешение было предоставлено с использованием устаревшего метода.

После запроса на разрешение пользователю будет показан диалог. Его / ее ответ будет доставлен как:

@Override
 public void onRequestPermissionsResult(int requestCode, String[] permissions,
         int[] grantResults) {
     if (requestCode == PERMISSIONS_REQUEST_CODE_ACCESS_COARSE_LOCATION
             && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
         // Do something with granted permission
        mWifiListener.getScanningResults();
     }
 }

. После этого вы можете проверить, включено ли службы местоположения, с помощью LocationServices.SettingsApi и попросить пользователя включить, если эти параметры отключены. Это возможно при обратном вызове Play Services LocationSettingsStatusCodes.RESOLUTION_REQUIRED.

49
ответ дан Deividi Cavarzan 27 August 2018 в 01:22
поделиться

В дополнение к данным ответам; вы также можете использовать checkSelfPermission из ContextCompat, чтобы обеспечить обратную совместимость с более низкими версиями Android:

if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_CODE_ACCESS_FINE_LOCATION);
    // Get the result in onRequestPermissionsResult(int, String[], int[])
} else {
    // Permission was granted, do your stuff here
}
2
ответ дан CptSadface 27 August 2018 в 01:22
поделиться

Правка

Итак, проблема связана с новой обработкой разрешений. Вы должны попросить разрешения, прежде чем переходить к коду Wi-Fi. Вот пример:

// call this method only if you are on 6.0 and up, otherwise call doGetWifi()
private void getWifi() {
    if (checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 0x12345);
    } else {
        doGetWifi(); // the actual wifi scanning
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == 0x12345) {
        for (int grantResult : grantResults) {
            if (grantResult != PackageManager.PERMISSION_GRANTED) {
                return;
            }
        }
        getWifi();
    }
}

Эта проверка должна выполняться в Activity.

Исходный образец кода доступен здесь , изменен в соответствии с проблемой, обсуждаемой в этом разделе.

Оригинал

Согласно связанным изменениям API , ваша заявка должна иметь один из разрешения на размещение. Цитата:

WifiManager.getScanResults (): ваше приложение должно иметь разрешение ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION.

Также обратите внимание, что есть новый логический ключ , полученный вашим BroadcastReceiver в действии SCAN_RESULTS_AVAILABLE_ACTION: EXTRA_RESULTS_UPDATED. Это показывает, завершено ли сканирование, и вы можете получить доступ к результатам, вызвав wifiManager.getScanResults().

7
ответ дан EricRobertBrewer 27 August 2018 в 01:22
поделиться

Я нашел связанную с этим проблему в проблеме с вопросом о проблеме AOSP 185370 WifiManager # getScanResults () возвращает список пустых массивов, если GPS отключен.

Проблема упоминается в # 1 . Мобильный телефон должен открыть службу определения местоположения, чтобы получить список мобильных телефонов.

И из # 18 участник проекта Android утверждает, что команда разработчиков исправлена проблема, о которой вы сообщили, и она будет доступна в будущей сборке.

APP находится в targetSdkVersion 23, просто следуйте приведенному выше решению, чтобы проверить разрешение во время выполнения. Принятие решения о включении проблемы с службами местоположений будет исправлено в будущей версии Android.

32
ответ дан Fantasy Fang 27 August 2018 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: