Android - Wi-Fi Direct / p2p не может найти одноранговые узлы на Android 8

Я начал создавать приложение для Android с функцией Wi-Fi Wi-Fi Direct. Я делаю одноранговое обнаружение, и мне нравится видеть сверстников в виде списка.

Теперь у меня есть приложение, которое пытается обнаружить одноранговые узлы и показывает их в списке.

Но я столкнулся с проблемой, что это нормально работает на моем устройстве Android 5. Здесь я вижу свое устройство Android 8, но не наоборот. Я не вижу свое устройство Android 5 на устройстве Android 8.

Я выполнил шаги отсюда: https://developer.android.com/training/connect-devices-wirelessly/nsd

А также обнаружил это сообщение: Проблемы Android O с обнаружением узлов Wi-Fi, в котором говорится, что мне нужно запросить разрешения, прежде чем продолжить.

Мой манифест:

<uses-permission
    android:required = "true"
    android:name = "android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission
    android:required = "true"
    android:name = "android.permission.ACCESS_WIFI_STATE"/>
<uses-permission
    android:required = "true"
    android:name = "android.permission.CHANGE_WIFI_STATE"/>
<uses-permission
    android:required = "true"
    android:name = "android.permission.INTERNET"/>

В чем может быть проблема? Может быть, я могу предоставить дополнительную информацию, если потребуется для решения проблемы?

1. Не могли бы вы опубликовать реализацию получения пиров и т. д., Так как это поможет другим вам помочь; и 2. при запросе разрешений подтверждаете ли вы, что разрешения предоставлены?

CybeX 22.05.2018 22:21
6
1
3 174
2

Ответы 2

Я исправил это, добавив разрешение на выполнение ...

Manifest.permission.ACCESS_COARSE_LOCATION

разрешено и все в порядке

где в вашем проекте вы это добавили?

DrBwts 29.04.2019 10:56

Чтобы решить указанную выше проблему с Android 8 (Oreo), нужно сделать два шага:
1) Предоставьте разрешение на местоположение.

    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{
       mManager.requestPeers(mChannel, mainActivity.peerListListener);
       //do something, permission was previously granted; or legacy device
    }


2) Включить службу определения местоположения / Включить GPS устройства. Ниже кода открывается диалоговое окно для включения местоположения.

public static void displayLocationSettingsRequest(final Context context, final int REQUEST_CHECK_SETTINGS) {
    GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
            .addApi(LocationServices.API).build();
    googleApiClient.connect();

    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(10000 / 2);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
    builder.setAlwaysShow(true);

    Task<LocationSettingsResponse> result = LocationServices.getSettingsClient(context).checkLocationSettings(builder.build());
    result.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() {
        @Override
        public void onComplete(@NonNull Task<LocationSettingsResponse> task) {
            LocationSettingsResponse response = null;
            try {
                response = task.getResult(ApiException.class);
            } catch (ApiException exception) {
                exception.printStackTrace();

                switch (exception.getStatusCode()) {
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied. But could be fixed by showing the
                        // user a dialog.
                        try {
                            // Cast to a resolvable exception.
                            ResolvableApiException resolvable = (ResolvableApiException) exception;
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            resolvable.startResolutionForResult((MainActivity)context, REQUEST_CHECK_SETTINGS);
                            break;
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.
                        } catch (ClassCastException e) {
                            // Ignore, should be an impossible error.
                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way to fix the
                        // settings so we won't show the dialog.

                        break;
                }
            }

        }
    });

На моем Nokia 6.1 Android 9 (уровень API 28) важно включить службу определения местоположения в настройках, проверка разрешения сама по себе не помогает. На моем Huawei P10 Lite Android 7.0 (уровень API 24) проверка разрешения только в порядке, нет необходимости включать службу определения местоположения в настройках. Либо произошло изменение с Android 7.0 на 8.0, либо это зависит от производителя. Примечание. Обработка опасных разрешений, таких как ранее измененное местоположение, в Android 6.0.

this.myself 16.01.2019 10:44

@priyanka Singhal, пожалуйста, сделайте оба шага

Zumbarlal Saindane 24.05.2019 07:26

Это вызывает ошибку. Метод выбросил исключение com.google.android.gms.common.api.ResolvableApiException.

Priyanka Singhal 24.05.2019 07:40

Другие вопросы по теме