2017-04-07 11 views
2

Google Awareness APIを使用してアクティビティフェンスを実装しようとしました。しかし、ユーザーの活動の変化は検出されません。ヘッドフォンフェンスは期待どおりに機能します。アクティビティフェンスが認識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

このフェンスが発射されたかどうかを確認するためにSTILLフェンスを追加しようとしましたか? – MPhil

+0

私は同じ問題に遭遇しています。私はユーザーの活動の変化に反応しようとしていますが、どうにかしてそれは1回だけトリガーされ、その後は繰り返されません。あなたはどんな洞察力を得ることができましたか? – saberrider

答えて

0

ヘッドフォンフェンスが動作していて、アクティビティフェンスがない場合は、マニフェストに許可を追加するのを忘れていた可能性がありますか?

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

私は許可も含めました。何らかの理由で質問に表示されていませんでした。私はそれを更新しました –

0

私はジオフェンシングの代わりにAwareness APIを使用しようとしましたが、あなたのコードをどのようにテストしたかという問題があると思います。 私はAwarenessが携帯電話のセンサーを使用していると確信していますので、GPSシミュレーターを使って歩行をシミュレートすると何も起こりませんが、私の実際の携帯電話を使って歩くとBroadcastReceiverが起動します。 しかし、私はエミュレータ上で "センサーウォーキング"をシミュレートする方法を知らない!

関連する問題