2017-04-07 5 views
2

Ich habe versucht, den Aktivitätszaun mithilfe der Google Awareness-API zu implementieren. Änderungen in der Benutzeraktivität werden jedoch nicht erkannt. Der Kopfhörerzaun funktioniert jedoch wie erwartet.Aktivitätszaun funktioniert nicht in der Awareness-API

ActivityFenceActivity

public class ActivityFenceActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks { 

private static final String FENCE_RECEIVER_ACTION = "FENCE_RECEIVE"; 
private static final String FENCE_WALKING_KEY = "walkingKey"; 
private static final String FENCE_RUNNING_KEY = "runningKey"; 
private static final String TAG = ActivityFenceActivity.class.getSimpleName(); 

private GoogleApiClient googleApiClient; 
private TextView activityTextView; 
private BroadcastReceiver activityFenceReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(final Context context, final Intent intent) { 
     Toast.makeText(context, "Recieved", Toast.LENGTH_SHORT).show(); 
     FenceState fenceState = FenceState.extract(intent); 

     if (TextUtils.equals(fenceState.getFenceKey(), FENCE_WALKING_KEY)) { 
      switch (fenceState.getCurrentState()) { 
       case FenceState.TRUE: 
        activityTextView.setText("User is walking"); 
        break; 
       case FenceState.FALSE: 
        activityTextView.setText("User is not walking"); 
        break; 
       case FenceState.UNKNOWN: 
        activityTextView.setText("Activity state unknown"); 
        break; 
      } 
     } else if (TextUtils.equals(fenceState.getFenceKey(), FENCE_RUNNING_KEY)) { 
      switch (fenceState.getCurrentState()) { 
       case FenceState.TRUE: 
        activityTextView.setText("User is running"); 
        break; 
       case FenceState.FALSE: 
        activityTextView.setText("User is not running"); 
        break; 
       case FenceState.UNKNOWN: 
        activityTextView.setText("Activity state unknown"); 
        break; 
      } 
     } 
    } 
}; 

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

    activityTextView = (TextView) findViewById(R.id.activityTextView); 

    googleApiClient = new GoogleApiClient.Builder(ActivityFenceActivity.this) 
      .addApi(Awareness.API) 
      .addConnectionCallbacks(this) 
      .build(); 
    googleApiClient.connect(); 

    findViewById(R.id.register_fence).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      registerActivityFence(); 
     } 
    }); 

    findViewById(R.id.unregister_fence).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      unregisterActivityFence(); 
     } 
    }); 


} 

@Override 
public void onConnected(@Nullable final Bundle bundle) { 
    Log.d(TAG, "Google API connected"); 

} 

@Override 
public void onConnectionSuspended(final int i) { 
    Log.d(TAG, "Google API connection suspended"); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 
    registerReceiver(activityFenceReceiver, new IntentFilter(FENCE_RECEIVER_ACTION)); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 

    unregisterReceiver(activityFenceReceiver); 
    unregisterActivityFence(); 
} 

private void registerActivityFence() { 
    AwarenessFence walkingFence = DetectedActivityFence.during(DetectedActivityFence.WALKING); 
    AwarenessFence runningFence = DetectedActivityFence.during(DetectedActivityFence.RUNNING); 

    PendingIntent fencePendingIntent = PendingIntent.getBroadcast(this, 
      0, 
      new Intent(FENCE_RECEIVER_ACTION), 
      0); 

    Awareness.FenceApi.updateFences(googleApiClient, new FenceUpdateRequest.Builder() 
      .addFence(FENCE_WALKING_KEY, walkingFence, fencePendingIntent).build()) 
      .setResultCallback(new ResultCallbacks<Status>() { 
       @Override 
       public void onSuccess(@NonNull final Status status) { 
        Toast.makeText(ActivityFenceActivity.this, 
          "Fence registered successfully", 
          Toast.LENGTH_SHORT).show(); 
       } 

       @Override 
       public void onFailure(@NonNull final Status status) { 
        Toast.makeText(ActivityFenceActivity.this, 
          "Cannot register activity fence.", 
          Toast.LENGTH_SHORT).show(); 
       } 
      }); 

    Awareness.FenceApi.updateFences(googleApiClient, new FenceUpdateRequest.Builder() 
      .addFence(FENCE_RUNNING_KEY, runningFence, fencePendingIntent).build()); 

} 

private void unregisterActivityFence() { 
    Awareness.FenceApi.updateFences(
      googleApiClient, 
      new FenceUpdateRequest.Builder() 
        .removeFence(FENCE_WALKING_KEY) 
        .removeFence(FENCE_RUNNING_KEY) 
        .build()).setResultCallback(new ResultCallbacks<Status>() { 
     @Override 
     public void onSuccess(@NonNull Status status) { 
      Toast.makeText(ActivityFenceActivity.this, 
        "Fence unregistered successfully.", 
        Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onFailure(@NonNull Status status) { 
      Toast.makeText(ActivityFenceActivity.this, 
        "Cannot unregister headphone fence.", 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:roundIcon="@mipmap/ic_launcher_round" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <meta-data 
     android:name="com.google.android.awareness.API_KEY" 
     android:value="AIzaSyBEmjlfC87xRUP2FnFynsDdY3QRuI1hIHs" /> 

</application> 

+0

Haben Sie versucht, den STILL Fence hinzuzufügen, um zu prüfen, ob dieser Zaun gefeuert wird? – MPhil

+0

Ich stoße auf das gleiche Problem. Ich versuche auf Änderungen in der Benutzeraktivität zu reagieren, aber irgendwie wird es nur einmal und dann nie wieder ausgelöst. Hast du jemals einen Einblick bekommen? – saberrider

Antwort

0

Wenn der Kopfhörerzaun funktioniert und der Aktivitätszaun nicht funktioniert, haben Sie vielleicht vergessen, die Berechtigung im Manifest hinzuzufügen?

<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/> 
+0

Ich habe die Erlaubnis auch eingeschlossen. Aus irgendeinem Grund wurde es in der Frage nicht angezeigt. Ich habe es aktualisiert –

0

Ich versuchte Awareness API anstelle von Geofencing zu verwenden, ich denke, das Problem ist, wie Sie Ihren Code getestet. Ich bin mir ziemlich sicher, dass Awareness die Sensoren des Telefons nutzt. Wenn ich also mit dem GPS-Simulator einen Spaziergang simuliere, löst das nichts aus, aber wenn ich mein richtiges Telefon benutze, wird BroadcastReceiver ausgelöst. Allerdings weiß ich nicht, wie man einen "sensor walking" auf dem Emulator simuliert!

Verwandte Themen