活动识别Api错误地检测到车辆

时间:2016-07-17 23:31:35

标签: android broadcastreceiver google-play-services intentservice activity-recognition

有时当用户坐着,或者手机仍然在桌子上时。 if语句检查inVehicle&触发100%并启动我的应用程序中的服务。我想不通为什么?

MainActivity中的活动识别

public String getDetectedActivity(int detectedActivityType) {
    Resources resources = this.getResources();
    switch (detectedActivityType) {
        case DetectedActivity.IN_VEHICLE:
            return resources.getString(R.string.in_vehicle);
        case DetectedActivity.ON_BICYCLE:
            return resources.getString(R.string.on_bicycle);
        case DetectedActivity.ON_FOOT:
            return resources.getString(R.string.on_foot);
        case DetectedActivity.RUNNING:
            return resources.getString(R.string.running);
        case DetectedActivity.WALKING:
            return resources.getString(R.string.walking);
        case DetectedActivity.STILL:
            return resources.getString(R.string.still);
        case DetectedActivity.TILTING:
            return resources.getString(R.string.tilting);
        case DetectedActivity.UNKNOWN:
            return resources.getString(R.string.unknown);
        default:
            return resources.getString(R.string.unidentifiable_activity, detectedActivityType);
    }
}


public void requestActivityUpdates() {
    if (!mGoogleApiClient.isConnected()) {
        Toast.makeText(this, "GoogleApiClient not yet connected", Toast.LENGTH_SHORT).show();
    } else {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("acr", true);
        editor.commit();

        ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(mGoogleApiClient, 100, getActivityDetectionPendingIntent()).setResultCallback(this);
    }

}

public void removeActivityUpdates() {
    ActivityRecognition.ActivityRecognitionApi.removeActivityUpdates(mGoogleApiClient, getActivityDetectionPendingIntent()).setResultCallback(this);
}

private PendingIntent getActivityDetectionPendingIntent() {
    Intent intent = new Intent(this, ActivitiesIntentService.class);

    return PendingIntent.getService(this, 20, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

public void onResult(Status status) {
    if (status.isSuccess()) {
        Log.e(TAG, "Successfully added activity detection.");

    } else {
        Log.e(TAG, "Error: " + status.getStatusMessage());
    }
}


public class ActivityDetectionBroadcastReceiver extends BroadcastReceiver {


    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    @Override
    public void onReceive(Context context, Intent intent) {
        ArrayList<DetectedActivity> detectedActivities = intent.getParcelableArrayListExtra(Constants.STRING_EXTRA);
        String activityString = "";
        for (DetectedActivity activity : detectedActivities) {
            activityString += "Activity: " + getDetectedActivity(activity.getType()) + ", Confidence: " + activity.getConfidence() + "%\n";
        }
        //mDetectedActivityTextView.setText(activityString);
        //Toast.makeText(context, activityString, Toast.LENGTH_LONG).show();
        Log.d(TAG2, activityString);

        final SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        detectEnabled = preferences.getBoolean("mode", false);
        buttonToggleDetect.setBackground(ui.uiToggle(getApplicationContext(), detectEnabled));


    }
}


@Override
public void onConnected(Bundle bundle) {
    Log.i(TAG, "Connected");
}

@Override
public void onConnectionSuspended(int i) {
    Log.i(TAG, "Connection suspended");
    mGoogleApiClient.connect();
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.i(TAG, "Connection failed. Error: " + connectionResult.getErrorCode());
}

意向服务

 public class ActivitiesIntentService extends IntentService {

    // TODO REMOVE EXPORTED & ENABLED IN MANIFEST RELATED TO THIS CLASS

    private static final String TAG = "ActivitiesIntentService";


    public ActivitiesIntentService() {
        super(TAG);
    }




    @Override
    protected void onHandleIntent(Intent intent) {

        boolean serviceState;
        int inVehicle = 0;
        int onFoot = 2;
        int walking = 7;
        int running = 8;
        int tilting = 5;
        int still = 3;


        Intent serviceIntent = new Intent(this, CallDetectService.class); //creating a new intent to be sent to CallDetectService class

        ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
        Intent i = new Intent(Constants.STRING_ACTION);

        ArrayList<DetectedActivity> detectedActivities = (ArrayList) result.getProbableActivities();

        // Log each activity.
        Log.i(TAG, "activities detected");
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
        serviceState = preferences.getBoolean("mode", false);

        for (DetectedActivity da : detectedActivities) {


            // // TODO: 16/07/16 local  invehicle int precentage, if int is <50  return
            // todo set up for logs from past day to be sent by user

            if (da.getType() == inVehicle && da.getConfidence() >= 100 ) {


                if (!serviceState) {
                    /*
                    ComponentName service = new ComponentName(getApplicationContext(), CallDetectService.class);
                    PackageManager pm = getApplicationContext().getPackageManager();
                    pm.setComponentEnabledSetting(service,
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                            PackageManager.DONT_KILL_APP);
                    */

                    Log.d("Service", "service enabled by acr");


                    startService(serviceIntent);
                    MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.music_marimba_chord);

                    mp.start();
                    //TODO ADD MP.FINISH HERE
                }

            }

            //else if (da.getType() == still  && da.getConfidence() >= 25)

            else if  (da.getType() == onFoot && da.getConfidence() >= 25
                    || da.getType() == walking && da.getConfidence() >= 25
                    || da.getType() == running && da.getConfidence() >= 25
                    || da.getType() == still && da.getConfidence() == 100)

            {
                // stop detect service
                if (serviceState) {
                    stopService(serviceIntent);

                    /*ComponentName service = new ComponentName(getApplicationContext(), CallDetectService.class);
                    PackageManager pm = getApplicationContext().getPackageManager();
                    pm.setComponentEnabledSetting(service,
                            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                            PackageManager.DONT_KILL_APP);
                    */

                    Log.d("Service", "service disabled by acr");


                }
            }

        }


        i.putExtra(Constants.STRING_EXTRA, detectedActivities);
        LocalBroadcastManager.getInstance(this).sendBroadcast(i);

    }
}

我错过了什么吗?我真的无法弄明白。 我尝试在评论的意向服务中添加组件启用/禁用设置。当我在代码中有这个时,服务没有在用户不在车内时启动,而是在他们实际在哪里时打开和关闭。 非常感谢任何帮助。

0 个答案:

没有答案