2015-03-18 9 views
5

Ich habe dieses Stück Code zusammengestellt, um die Benutzeraktivität zu erhalten, zu sehen, ist er zu Fuß oder fahren oder noch, aber es funktioniert nicht, onHandleIntent nie aufgerufen. Es verbindet sich mit GoogleApiClient.android ActivityRecognition nicht aufrufen onHandleIntent

Hier ist mein Code

Aktivität Layout-

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

<TextView android:text="@string/hello_world" android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/msg" /> 

MainActivity

import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.ActivityRecognition; 

public class MainActivity extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

private Context mContext; 
private GoogleApiClient mGApiClient; 
private BroadcastReceiver receiver; 
private TextView textView; 

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

    //get the textview 
    textView = (TextView) findViewById(R.id.msg); 

    //Set the context 
    mContext = this; 

    //Check Google Play Service Available 
    if(isPlayServiceAvailable()) { 
     mGApiClient = new GoogleApiClient.Builder(this) 
       .addApi(ActivityRecognition.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
     //Connect to gPlay 
     mGApiClient.connect(); 
    }else{ 
     Toast.makeText(mContext, "Google Play Service not Available", Toast.LENGTH_LONG).show(); 
    } 

    //Broadcast receiver 
    receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String v = "Activity :" + 
        intent.getStringExtra("act") + " " + 
        "Confidence : " + intent.getExtras().getInt("confidence") + "n"; 

      v += textView.getText(); 
      textView.setText(v); 
     } 
    }; 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction("SAVVY"); 
    registerReceiver(receiver, filter); 
} 

private boolean isPlayServiceAvailable() { 
    return GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext) == ConnectionResult.SUCCESS; 
} 

@Override 
public void onConnected(Bundle bundle) { 
    Intent i = new Intent(this, ActivityRecognitionIntentService.class); 
    PendingIntent mActivityRecongPendingIntent = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT); 

    Log.d("Saquib", "connected to ActRecog " + "PI " +mActivityRecongPendingIntent.toString()); 
    ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(mGApiClient, 0, mActivityRecongPendingIntent); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Log.d("Saquib", "suspended to ActRecog"); 
} 

@Override 
public void onConnectionFailed(ConnectionResult connectionResult) { 
    Log.d("Saquib", "Not connected to ActRecog"); 
} 

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

     mGApiClient.disconnect(); 

     unregisterReceiver(receiver); 
    } 
    } 

ActivityRec ognitionIntentService

import android.app.IntentService; 
import android.content.Intent; 
import android.util.Log; 

import com.google.android.gms.location.ActivityRecognitionResult; 
import com.google.android.gms.location.DetectedActivity; 

/** 
* Created by tutsberry on 17/03/15. 
*/ 
public class ActivityRecognitionIntentService extends IntentService { 

public ActivityRecognitionIntentService() { 
    super("ActivityRecognitionIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 

    if(ActivityRecognitionResult.hasResult(intent)) { 
     ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent); 
     DetectedActivity detectedActivity = result.getMostProbableActivity(); 

     int confidence = detectedActivity.getConfidence(); 
     String mostProbableName = getActivityName(detectedActivity.getType()); 

     Intent i = new Intent("SAVVY"); 
     i.putExtra("act", mostProbableName); 
     i.putExtra("confidence", confidence); 

     Log.d("Saquib", "mostProbableName " + mostProbableName); 
     Log.d("Saquib", "Confidence : " + confidence); 

     //Send Broadcast 
     this.sendBroadcast(i); 

    }else { 
     Log.d("Saquib", "Intent had no data returned"); 
    } 
} 

private String getActivityName(int type) { 
    switch (type) 
    { 
     case DetectedActivity.IN_VEHICLE: 
      return "in_vehicle"; 
     case DetectedActivity.ON_BICYCLE: 
      return "on_bicycle"; 
     case DetectedActivity.WALKING: 
      return "walking"; 
     case DetectedActivity.STILL: 
      return "still"; 
     case DetectedActivity.TILTING: 
      return "tilting"; 
     case DetectedActivity.UNKNOWN: 
      return "unknown"; 
     case DetectedActivity.RUNNING: 
      return "running"; 

    } 
    return "n/a"; 
} 
} 

und manifestieren

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.tutsberry.moveyours" > 

<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:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

    <service android:name=".ActivityRecognitionIntentService"> 

</service> 
    </application> 

</manifest> 

Jungs bitte helfen, ist google doc keine Verwendung für ActivityRecognition

+0

Haben Sie versucht, eine Broadcast-anhängige Absicht statt eines Service anhängig Absicht verwendet? – Muzikant

+0

Sie können versuchen, einen anderen Anforderungscode als 0 zu verwenden, wenn Sie die ausstehende Absicht erstellen – Muzikant

+0

Ich habe versucht, das funktioniert, es funktioniert auf meinem Sony-Telefon, aber nichts ist genau es falsche Aktivitäten mit 80% Vertrauen geben. Ich denke, ActivityRecognition ist keine zuverlässige API, deshalb gibt es keine gute Dokumentation zu offiziellen Dokumenten. – Saqueib

Antwort

2

Vergewissern Sie sich, dass Sie mit dem Internet verbunden sind vorher. Ich denke, sonst wird es nicht funktionieren. Wenn Sie sich zum ersten Mal mit Google Play-Diensten verbinden, müssen Sie mit dem Internet verbunden sein.

+0

funktioniert nicht auf meinem 4.2.2 Android-Handy. aber es funktioniert auf meinem anderen Sony-Telefon, das läuft 4.0 – Saqueib

4

Vielleicht fehlt Ihnen die

<uses-permission android:name="android.permission.INTERNET" /> 
+0

Hinzugefügt, das gleiche Problem. Es funktioniert nicht auf beiden Geräten. Es funktioniert auf meinem zweiten Gerät ohne Netzerlaubnis. Ich habe versucht, '' & aktualisierte Google Play-Dienst, aber kein Glück. – Saqueib

Verwandte Themen