首页 > 解决方案 > 无论我将什么类型的附件添加到信标中,getBeaconState() 都返回 null

问题描述

通过 Beacon 仪表板设置我的附件详细信息。我不断得到:getBeaconState("FILTER") null。我的目标是暂时检测附近的信标。任何一种形式对我的帮助都会很棒!

我已经按照 eddystone 格式设置了我的虚拟信标并且它运行良好(在信标仪表板中我看到:信标处于活动状态并且工作正常!)并且显然已经在 Google 控制台上设置了我的项目并向广告商添加了相同的 API 密钥和这个(扫描仪)应用程序。

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();
                });
    }
}

因此,当我调试时,它进入addOnSuccessListenerbeaconState始终为null

标签: androidbluetoothsnapshotbeacon

解决方案


确保getBeaconState()仅支持 18 以上的设备 API 级别。

如果从运行早期版本(低于 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()方法。我希望它会帮助你......!


推荐阅读