使用Awareness API获取Beacon Fence需要花费太多时间而且不准确

时间:2017-02-13 09:26:13

标签: java android google-awareness

这是我获取BeaconFence的代码。这需要花费太多时间而且没有提供准确的信息我拿到了两个丢失的栅栏并找到了

// BeaconFenceActivity.java

import android.Manifest;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.azilen.awarenessapidemo.R;
import com.google.android.gms.awareness.Awareness;
import com.google.android.gms.awareness.fence.AwarenessFence;
import com.google.android.gms.awareness.fence.BeaconFence;
import com.google.android.gms.awareness.fence.FenceState;
import com.google.android.gms.awareness.fence.FenceUpdateRequest;
import com.google.android.gms.awareness.state.BeaconState;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.ResultCallbacks;
import com.google.android.gms.common.api.Status;

import java.util.Arrays;
import java.util.List;

public class BeaconFenceActivity extends AppCompatActivity {

    private GoogleApiClient mGoogleApiClient;
    private static final int PERMISSION_REQUEST_ACCESS_FINE_LOCATION = 940;
    private TextView txtBeacon;


    private static final String BEACON_FENCE_KEY = "BEACON_FENCE_KEY";
    private static final int BEACON_ZONE_IN = 2;
    private static final int BEACON_ZONE_OUT = 1;

    private PendingIntent mPendingIntent;
    private BeaconFenceReceiver mBeaconFenceReceiver;
    private ProgressDialog mProgress;

    //Replace this with app's Google project name
    private static final List<BeaconState.TypeFilter> BEACON_TYPE_FILTERS = Arrays.asList
            (BeaconState.TypeFilter.with("awarenessapidemo-158205", "beacondemo"));

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_beacon_fence);
        mProgress = new ProgressDialog(BeaconFenceActivity.this);
        mProgress.setTitle("Geting Near Beacon");
        mProgress.setMessage("Please wait..");

        txtBeacon = (TextView) findViewById(R.id.txt_fence_beacon);
        mGoogleApiClient = new GoogleApiClient.Builder(BeaconFenceActivity.this).addApi(Awareness.API).build();
        mGoogleApiClient.connect();

        mBeaconFenceReceiver = new BeaconFenceReceiver();
        Intent intent = new Intent(BeaconFenceReceiver.BEACON_FENCE_RECEIVER_ACTION);
        mPendingIntent = PendingIntent.getBroadcast(BeaconFenceActivity.this, 1, intent, 0);
    }


    @Override
    protected void onStart() {
        super.onStart();
        getBeaconDetails();
        registerReceiver(mBeaconFenceReceiver, new IntentFilter(BeaconFenceReceiver.BEACON_FENCE_RECEIVER_ACTION));
    }

    @Override
    protected void onStop() {
        super.onStop();
        unregisterFences();
        unregisterReceiver(mBeaconFenceReceiver);
    }


    private void getBeaconDetails() {
        mProgress.show();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSION_REQUEST_ACCESS_FINE_LOCATION);
            mProgress.hide();
        } else {
            AwarenessFence beaconFoundFence = BeaconFence.found(BEACON_TYPE_FILTERS);
            AwarenessFence lostFence = BeaconFence.lost(BEACON_TYPE_FILTERS);
            AwarenessFence orFence = AwarenessFence.or(lostFence, beaconFoundFence);

            Awareness.FenceApi.updateFences(mGoogleApiClient,
                    new FenceUpdateRequest.Builder()
                            .addFence(BEACON_FENCE_KEY, orFence, mPendingIntent)
                         /* .addFence(BEACON_FENCE_KEY, beaconFoundFence, mPendingIntent)
                            .addFence(BEACON_FENCE_KEY, lostFence, mPendingIntent)
                           */
                            .build()).setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(@NonNull Status status) {
                    if (status.isSuccess()) {
                        Toast.makeText(BeaconFenceActivity.this, "Fence Registered", Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(BeaconFenceActivity.this, "Fence Not Registered", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            mProgress.hide();
        }
    }

    private void unregisterFences() {
        Awareness.FenceApi.updateFences(
                mGoogleApiClient,
                new FenceUpdateRequest.Builder()
                        .removeFence(BEACON_FENCE_KEY)
                        .build()).setResultCallback(new ResultCallbacks<Status>() {
            @Override
            public void onSuccess(@NonNull Status status) {
                Toast.makeText(BeaconFenceActivity.this, "Fence Removed", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFailure(@NonNull Status status) {
                Toast.makeText(BeaconFenceActivity.this, "Fence Not Removed", Toast.LENGTH_SHORT).show();
            }
        });

    }

    public void checkRestart(View view) {
        getBeaconDetails();
        registerReceiver(mBeaconFenceReceiver, new IntentFilter(BeaconFenceReceiver.BEACON_FENCE_RECEIVER_ACTION));
    }

    public class BeaconFenceReceiver extends BroadcastReceiver {

        public static final String BEACON_FENCE_RECEIVER_ACTION = "com.azilen.awarenessapidemo.activities.fence.BeaconFenceReceiver.BEACON_FENCE_RECEIVER_ACTION";

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.e("Recived", "Received a Beacon Fence Broadcast");
            FenceState fenceState = FenceState.extract(intent);
            Log.e("FenceState Status:-", String.valueOf(fenceState.getFenceKey()));
            if (TextUtils.equals(fenceState.getFenceKey(), BEACON_FENCE_KEY)) {
                Log.e("FenceState:-", String.valueOf(fenceState.getCurrentState()));
                switch (fenceState.getCurrentState()) {
                    case FenceState.TRUE: {
                        setBeaconState(BEACON_ZONE_IN);
                        Toast.makeText(BeaconFenceActivity.this, "You've entered the beacon zone!", Toast.LENGTH_SHORT).show();
                        Log.e("Beacon", "In Range");
                        break;
                    }
                    case FenceState.FALSE: {
                        setBeaconState(BEACON_ZONE_OUT);
                        Log.e("Beacon", "Out of Range");
                        Toast.makeText(BeaconFenceActivity.this, "You've Out of beacon Range!", Toast.LENGTH_SHORT).show();
                        break;
                    }
                    case FenceState.UNKNOWN: {
                        setBeaconState(FenceState.UNKNOWN);
                        Log.e("Beacon", "UNKNOWN");
                        Toast.makeText(BeaconFenceActivity.this, "Oops, Beacon status is unknown!", Toast.LENGTH_SHORT).show();
                        break;
                    }
                }


            }
        }
    }

    private void setBeaconState(int beaconState) {
        if (beaconState == BEACON_ZONE_IN) {
            txtBeacon.setText("You've entered the beacon zone!");
        } else if (beaconState == BEACON_ZONE_OUT) {
            txtBeacon.setText("You're not in the beacon zone..");
        } else {
            txtBeacon.setText("Oops, Beacon status is unknown!");
        }
    }
}

我希望你能理解我的问题。 谢谢。

1 个答案:

答案 0 :(得分:0)

我无法告诉你为什么要花很多时间。 但是,如果要准确,你必须记住, 您对信标的位置是从中计算出来的 信标发送的信号/信号强度,就像信号中的每个信号一样 微波频谱被反射,阻挡等 您使用信标的环境可能是 远非理想,以获得您想要的信息准确性 由信标提供。