2017-02-13 59 views
2

這是我獲得BeaconFence.It的花費太多時間代碼,而不是提供準確的信息,我取出兩個圍欄失物招領獲取燈塔護欄使用意識API它花費太多的時間和不準確的

// 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!"); 
     } 
    } 
} 

我希望你能理解我的問題。 謝謝。

回答

0

我不能告訴你爲什麼要花費很多時間。 但是,如果您需要記住準確度,您的位置到信標的計算從 信號發送的信號/信號強度,就像 中的每個信號一樣,微波頻譜會被反射,阻擋等。 您使用信標的環境可能是 ,遠非理想情況,您可以通過信標提供的信息 獲得所需的準確性。