Соседний API не получает никаких сообщений

Я попытался подключиться к API ближайших сообщений и успешно смог подписаться.

Теперь мое поле mMessageListener по какой-то причине никогда не получает обратных вызовов. Я уже настроил свои маяки с помощью API-интерфейса бесконтактного маяка с помощью демонстрационного приложения службы маяков Android.

public class MainActivity extends AppCompatActivity implements
    GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

// Declaration of member variables
private GoogleApiClient mGoogleApiClient;
private final String TAG = "Bridge.MainActivity";
private boolean mResolvingError = false;
private static final int REQUEST_RESOLVE_ERROR = 100;
private static final int REQUEST_PERMISSION = 42;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initializing the Google API client


}


private MessageListener mMessageListener = new MessageListener() {
    @Override
    public void onFound(Message message) {
        // Do something with the message
        Log.i(TAG, " Found Message : " + message.toString());
    }

    @Override
    public void onLost(Message message) {
        super.onLost(message);
        Log.i(TAG, " Found Message : " + message.toString());
    }
};

@Override
public void onConnected(@Nullable Bundle bundle) {
    Log.d(TAG, "GoogleAPi Client Connected");
    foregorundSubscribeBeacons();
}

@Override
public void onConnectionSuspended(int i) {
    Log.d(TAG, "Google Api Connection Suspended : " + i);
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
    Log.d(TAG, "GoogleApi Connection failed : " + connectionResult.getErrorMessage());
}

public void foregorundSubscribeBeacons() {
    // Subscribe to receive messages
    Log.i(TAG, "Trying to subscribe");
    if (!mGoogleApiClient.isConnected()) {
        if (!mGoogleApiClient.isConnecting()) {
            mGoogleApiClient.connect();
        }
    } else {
        SubscribeOptions options = new SubscribeOptions.Builder()
                .setStrategy(Strategy.BLE_ONLY)
                .setCallback(new SubscribeCallback() {
                    @Override
                    public void onExpired() {
                        Log.i(TAG, "No longer subscribing.");
                    }
                }).build();

        Nearby.Messages.subscribe(mGoogleApiClient, mMessageListener, options)
                .setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(Status status) {
                        if (status.isSuccess()) {
                            Log.i(TAG, "Subscribed successfully.");

                        } else {
                            Log.i(TAG, "Could not subscribe.");
                            // Check whether consent was given;
                            // if not, prompt the user for consent.
                            handleUnsuccessfulNearbyResult(status);
                        }
                    }
                });

    }
}

private void handleUnsuccessfulNearbyResult(Status status) {
    Log.i(TAG, "Processing error, status = " + status);
    if (mResolvingError) {
        // Already attempting to resolve an error.
        return;
    } else if (status.hasResolution()) {
        try {
            mResolvingError = true;
            status.startResolutionForResult(this,
                    REQUEST_RESOLVE_ERROR);
        } catch (IntentSender.SendIntentException e) {
            mResolvingError = false;
            Log.i(TAG, "Failed to resolve error status.", e);
        }
    } else {
        if (status.getStatusCode() == CommonStatusCodes.NETWORK_ERROR) {
            Toast.makeText(this.getApplicationContext(),
                    "No connectivity, cannot proceed. Fix in 'Settings' and try again.",
                    Toast.LENGTH_LONG).show();
        } else {
            // To keep things simple, pop a toast for all other error messages.
            Toast.makeText(this.getApplicationContext(), "Unsuccessful: " +
                    status.getStatusMessage(), Toast.LENGTH_LONG).show();
        }
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_RESOLVE_ERROR) {
        // User was presented with the Nearby opt-in dialog and pressed "Allow".
        mResolvingError = false;
        if (resultCode == RESULT_OK) {
            // Execute the pending subscription and publication tasks here.
           foregorundSubscribeBeacons();
        } else if (resultCode == RESULT_CANCELED) {
            // User declined to opt-in. Reset application state here.
        } else {
            Toast.makeText(this, "Failed to resolve error with code " + resultCode,
                    Toast.LENGTH_LONG).show();
        }
    }
}

@Override
protected void onStart() {
    super.onStart();
    //Initiate connection to Play Services
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Nearby.MESSAGES_API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
    mGoogleApiClient.connect();

    //The location permission is required on API 23+ to obtain BLE scan results
    int result = ActivityCompat
            .checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);
    if (result != PackageManager.PERMISSION_GRANTED) {
        //Ask for the location permission
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                REQUEST_PERMISSION);
    }
}

@Override
protected void onStop() {
    super.onStop();
    //Tear down Play Services connection
    if (mGoogleApiClient.isConnected()) {
        Log.d(TAG, "Un-subscribing…");

        mGoogleApiClient.disconnect();
    }
}

person Navneet M Kumar    schedule 07.02.2016    source источник


Ответы (2)


Убедитесь, что и демонстрационное приложение Beacon Service, и приложение, использующее Сообщения поблизости, являются частью одного и того же проекта Google Developers Console. Вы будете видеть только сообщения, прикрепленные вашим собственным проектом.

person Joe Farfel    schedule 08.02.2016

Если вы успешно выполнили регистрацию маяка, добавив вложение к маяку на сервере реестра Google Beacon; затем успешно подписался на устройстве.

ПРЕДВАРИТЕЛЬНАЯ ПОДГОТОВКА НЕОБХОДИМА, ИНАЧЕ ВЫ НЕ ПОЛУЧИТЕ ВЕЩИ НА УСТРОЙСТВО.

Поэтому, когда маяк обнаружен, onFound(Message msg) вызывается для каждого вложения соответствующего маяка. ОНИ ЧЕТКО СКАЗАЛЫ: «СДЕЛАЙТЕ ЧТО-ТО С СООБЩЕНИЕМ» в onFound(), поэтому обрабатывайте ваше вложение только там, а не за пределами onFound().

Здесь, если вы напечатаете переменную msg в журнале, это должно выглядеть так:

Message{namespace='yourprojectname-1234', type='abcd', content=[614 bytes], devices=[NearbyDevice{id=NearbyDeviceId{UNKNOWN}}]}

Получите содержимое вложения с помощью msg.getContent() в строковую переменную. Это обычный текст, а не в формате base64. Как только вы получите содержимое строки, ДЕЛАЙТЕ ВСЕ, ЧТО вы хотели сделать.

Теперь вам решать, какой контент войдет во вложение.

Я использовал JSON во вложении и успешно обработал для своей цели.

person Community    schedule 23.02.2016