Ошибка API-интерфейса Nearby message — Nearby.Messages не включена для этого приложения: packageName

Я пытаюсь использовать ближайший API сообщений, чтобы получить сообщение от маяка Eddystone. Я следовал следующей документации:

[https://developers.google.com/nearby/messages/overview?hl=ru][1]

Я использую SHA1 из хранилища ключей отладки по умолчанию. Но я продолжаю получать следующее сообщение об ошибке

 Nearby.Messages is not enabled for this app: packageName

Устройство: Nexus 6 (версия Android 5.1.1)

Версия игровых сервисов: 8.1.15


person rahulrv    schedule 22.09.2015    source источник
comment
Можете ли вы добавить информацию о вашем устройстве? Какую версию сервисов Google Play вы используете?   -  person Shailen Tuli    schedule 22.09.2015
comment
@ShailenTuli Я обновил сообщение с версией устройства и игровых сервисов.   -  person rahulrv    schedule 22.09.2015
comment
Трудно понять без дополнительного контекста, почему вы получаете сообщение. Можете ли вы собрать и запустить пример NearbyDevices с сайта github.com/googlesamples/android-nearby? Следуйте инструкциям в README для настройки ключа в манифесте и т. д. Измените метод подписки Nearby.Messages.subscribe(mGoogleApiClient, mMessageListener, PUB_SUB_STRATEGY) на Nearby.Messages.subscribe(mGoogleApiClient, messageListener, Strategy.BLE_ONLY). Дай мне знать, если это работает.   -  person Shailen Tuli    schedule 22.09.2015
comment
Я пробовал этот образец ранее и пытался отладить его, я получаю ту же ошибку. Хотя я заменил ключ API. Это как-то связано с хранилищем ключей. Я использую хранилище ключей отладки по умолчанию для студии Android.   -  person rahulrv    schedule 22.09.2015
comment
Найдите сгенерированный apk и используйте keytool -list -printcert -jarfile {something}.apk | grep SHA1 для получения SHA. Затем следуйте инструкциям в README.   -  person Shailen Tuli    schedule 22.09.2015
comment
Кажется, это правильный SHA1, я получаю следующее сообщение об ошибке в onResult() ResultCallback: Nearby.Messages не включен для этого приложения: packageName   -  person rahulrv    schedule 23.09.2015
comment
Я только что клонировал образец и успешно его запустил. Возможно, вы можете опубликовать свой вывод журнала?   -  person Shailen Tuli    schedule 23.09.2015


Ответы (2)


Вы получаете эту ошибку, потому что не запросили разрешения у пользователя явным образом, что вы должны сделать, чтобы использовать Nearby API. Вот один из способов сделать это:

// GoogleApiClient connection callback. Initiate permission check here.
@Override
public void onConnected(Bundle connectionHint) {
    Nearby.Messages.getPermissionStatus(mGoogleApiClient).setResultCallback(
            new ErrorCheckingCallback("getPermissionStatus", new Runnable() {
                @Override
                public void run() {
                    publishAndSubscribe();
                }
            })
    );
}


// This is called in response to a button tap in the Nearby permission dialog.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_RESOLVE_ERROR) {
        mResolvingError = false;
        if (resultCode == RESULT_OK) {
            // Permission granted or error resolved successfully then we proceed
            // with publish or subscribe..
            publishAndSubscribe();
        } else {
            // This may mean that user had rejected to grant nearby permission.
            showToast("Failed to resolve error with code " + resultCode);
        }
    }
}


/**
* A simple ResultCallback that displays a toast when errors occur.
* It also displays the Nearby opt-in dialog when necessary.
*/
private class ErrorCheckingCallback implements ResultCallback<Status> {
   private final String method;
   private final Runnable runOnSuccess;

   private ErrorCheckingCallback(String method) {
       this(method, null);
   }

   private ErrorCheckingCallback(String method, @Nullable Runnable runOnSuccess) {
       this.method = method;
       this.runOnSuccess = runOnSuccess;
   }

   @Override
   public void onResult(@NonNull Status status) {
       if (status.isSuccess()) {
           Log.i(TAG, method + " succeeded.");
           if (runOnSuccess != null) {
               runOnSuccess.run();
           }
       } else {
           // Currently, the only resolvable error is that the device is not opted
           // in to Nearby. Starting the resolution displays an opt-in dialog.
           if (status.hasResolution()) {
               if (!mResolvingError) {
                   try {
                       status.startResolutionForResult(MainActivity.this,
                               REQUEST_RESOLVE_ERROR);
                       mResolvingError = true;
                   } catch (IntentSender.SendIntentException e) {
                       showToastAndLog(Log.ERROR, method + " failed with exception: " + e);
                   }
               } else {
                   // This will be encountered on initial startup because we do
                   // both publish and subscribe together.  So having a toast while
                   // resolving dialog is in progress is confusing, so just log it.
                   Log.i(TAG, method + " failed with status: " + status
                           + " while resolving error.");
               }
           } else {
               showToastAndLog(Log.ERROR, method + " failed with : " + status
                       + " resolving error: " + mResolvingError);
           }
       }
   }
}

Полный пример можно найти в документации.

Кроме того, помните об рекомендациях:

  • #P4#
  • #P5#
person EyesClear    schedule 08.10.2015
comment
небольшое изменение, я думаю, что это должно быть status.startResolutionForResult(MainActivity.this,ConnectionResult.RESOLUTION_REQUIRED); Я не смог найти REQUEST_RESOLVE_ERROR - person tallen; 14.12.2015
comment
@tallen Это просто так называемый код запроса, случайная константа, определенная вами. Это может быть любое целое число. См. developer.android.com/training/basics/intents/result.html для получения дополнительной информации. - person EyesClear; 16.12.2015
comment
Это более-менее правильно. Я обнаружил, что то, как они сделали класс обратного вызова (с runnable), было излишне запутанным, или, может быть, я просто не настолько умен, я еще не решил. Во время выполнения вам дважды перезванивают, потому что вы неявно запрашиваете два разрешения (это неправильное слово, возможно, лучше отказаться). Вызов startResolutionForResult вызывает действие, которое запрашивает разрешения. Эти разрешения (opt-ins) не следует путать с тем, что вы делаете в манифесте, это вещь GooglePlayServicesAPI. - person tallen; 17.12.2015

Вы должны явно запросить у пользователя разрешение на использование Nearby. Nearby API теперь предоставляет ярлык для кода, предоставляемого EyesClear. Вам просто нужно вызвать enableAutoManage в конструкторе клиентов API.

Подробности смотрите по адресу: https://developers.google.com/nearby/messages/android/user-consent

К сожалению, это может работать только для подписок переднего плана.

person Dietatko    schedule 03.11.2016