2015-03-18 9 views
5

Ho messo insieme questo pezzo di codice per ottenere l'attività degli utenti, per vedere se sta camminando o guidando o ancora, ma non funziona, onHandleIntent non ha mai chiamato. è collegato a GoogleApiClient.Android ActivityRecognition not calling onHandleIntent

Ecco il mio codice

layout Attività

<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"; 
} 
} 

e manifesta

<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> 

Ragazzi prega di aiuto, google doc è alcuna utilità per ActivityRecognition

+0

Hai provato a usare un intento Trasmissione in attesa invece di un servizio sospeso intento? – Muzikant

+0

Si può provare a utilizzare un codice di richiesta diverso da 0 durante la creazione dell'intento in sospeso – Muzikant

+0

Ho provato a farlo, funziona sul mio telefono Sony ma nulla è accurato continua a dare attività sbagliate con l'80% di confidenza. Penso che ActivityRecognition API non affidabile sia il motivo per cui non esiste una buona documentazione sui documenti ufficiali. – Saqueib

risposta

2

Assicurarsi che si è connessi a Internet in anticipo. Penso che diversamente non funzionerà. La prima volta che ti connetti a Google Play Services devi essere connesso a Internet.

+0

non funziona sul mio telefono Android 4.2.2. ma funziona sul mio altro telefono Sony che è in esecuzione 4.0 – Saqueib

4

Forse vi manca il

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

Aggiunto, lo stesso problema. Non funziona su entrambi i dispositivi. Sta lavorando sul mio secondo dispositivo senza autorizzazione netta. Ho provato ad aggiungere '' e aggiornato il servizio di google play ma senza fortuna. – Saqueib