getBeaconState () возвращает null, независимо от того, какой тип вложения я добавляю в маяк - PullRequest
0 голосов
/ 14 октября 2019

Настройка деталей моего вложения через приборную панель Beacon. Я продолжаю получать: getBeaconState("FILTER") ноль . Моя цель - просто определить, когда маяк рядом. Любая форма, которая помогла бы мне, была бы великолепна!

Я уже настроил свой виртуальный маяк в соответствии с форматом eddystone, и он отлично работает (на приборной панели маяка я вижу: маяк активен и работает правильно!)настройте мой проект на консоли Google и добавьте те же ключи API в Advertiser и это приложение (сканер).

public class MainActivity extends AppCompatActivity {

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
    public static final String TAG = MainActivity.class.getSimpleName();
    List<BeaconState.TypeFilter> BEACON_TYPE_FILTERS = Arrays.asList(BeaconState.TypeFilter
            .with("alpine-shade-255114", "int"));

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        hasLocationPermission();
        addBeaconDetectorFence();
    }

    private void hasLocationPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION);
            return;
        }
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    private void addBeaconDetectorFence() {
        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION);
            return;
        }

        Awareness.getSnapshotClient(this).getBeaconState(BEACON_TYPE_FILTERS)
                .addOnSuccessListener(beaconResult -> {
                    Log.e(TAG, "Got beacon state");
                    if(beaconResult!=null){
                    BeaconState beaconState = beaconResult.getBeaconState();
                    Toast.makeText(MainActivity.this, "Got beacon state! " + beaconState,
                            Toast.LENGTH_SHORT).show();}
                })
                .addOnFailureListener(e -> {
                    Log.e(TAG, "Could not get beacon state");
                    Toast.makeText(MainActivity.this, "Could not get beacon state!",
                            Toast.LENGTH_SHORT).show();
                });
    }
}

Итак, когда я отлаживаю, он вводит addOnSuccessListener, но beaconState всегда нуль .

1 Ответ

0 голосов
/ 14 октября 2019

Убедитесь, что getBeaconState() поддерживается только на уровне API устройства выше 18.

При вызове с устройства, работающего под управлением более ранней версии (ниже API 18), getStatus() вернет статус, такой как API_NOT_AVAILABLE .

Более того, метод getBeaconState() требует разрешения android.permission.ACCESS_FINE_LOCATION. Добавьте это разрешение в файл AndroidManifest.xml.

Awareness.SnapshotApi.getBeaconState(mGoogleApiClient, BEACON_TYPE_FILTERS)
                .setResultCallback(new ResultCallback<BeaconStateResult>() {
                    @Override
                    public void onResult(@NonNull BeaconStateResult beaconStateResult) {
                        if (!beaconStateResult.getStatus().isSuccess()) {
                            Log.e(TAG, "Could not get beacon state.");
                            return;
                        }
                        BeaconState beaconState = beaconStateResult.getBeaconState();
                        // Get info from the BeaconState.
                    }
                });

В своем коде вы пропускаете метод onResult(). Надеюсь, это тебе поможет ...!

...