0

Android で動作する ActivityrecognitionAPI を持っている人はいます。更新はありません。APIドキュメント、たくさんの例を試しました。OnHandleIntent は発火しません。

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

import android.app.IntentService;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;

public class ActivityRecognitionIntentService extends IntentService{

    ActivityRecognitionResult result;
    Intent i;
    DetectedActivity mpactivity;

    public ActivityRecognitionIntentService() {
        super("ActivityRecognitionIntentService");
        i = new Intent("ACTIVITY_RECOGNITION_DATA");
        }

    private String getTypes(int type) {
        if(type == DetectedActivity.UNKNOWN)
            return "Unknown";
        else if(type == DetectedActivity.IN_VEHICLE)
            return "In Vehicle";
        else if(type == DetectedActivity.ON_BICYCLE)
            return "On Bicycle";
        else if(type == DetectedActivity.RUNNING)
            return "Running";
        else if(type == DetectedActivity.ON_FOOT)
            return "On Foot";
        else if(type == DetectedActivity.STILL)
            return "Still";
        else if(type == DetectedActivity.TILTING)
            return "Tilting";
        else if(type == DetectedActivity.WALKING)
            return "Walking";
        else
            return "";
        }

    @Override
    protected void onHandleIntent(Intent intent) {
         if (intent.getAction() == "ActivityRecognitionIntentService") {
            if(ActivityRecognitionResult.hasResult(intent)){    
                result = ActivityRecognitionResult.extractResult(intent);
                mpactivity = result.getMostProbableActivity();
                i.putExtra("Activity", getTypes(mpactivity.getType()));
                i.putExtra("Confidence", mpactivity.getConfidence());
                LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(i);
                }
            }
        }
    }       

主な活動は、

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

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.widget.TextView;
import android.widget.Toast;

public class Actrecogex extends Activity implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener,  GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{

    TextView textView1;
    GoogleApiClient mGoogleActclient;
    PendingIntent mActivityRecognitionPendingIntent;
    Intent i;
    LocalBroadcastManager mBroadcastManager;

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

        textView1 = new TextView(this);
        textView1 =(TextView)findViewById(R.id.textView1);   

        i = new Intent(this, ActivityRecognitionIntentService.class);  
        mBroadcastManager = LocalBroadcastManager.getInstance(this);

        mGoogleActclient = new GoogleApiClient.Builder(this)
        .addApi(ActivityRecognition.API)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .build();

        mGoogleActclient.connect();
        }

    @Override
    public void onConnectionFailed(ConnectionResult arg0) {
        textView1.setText("Failed Connection" + arg0); 
        }

    @Override
    public void onConnected(Bundle arg0) {
        i.setAction("ActivityRecognitionIntentService");
        mActivityRecognitionPendingIntent = PendingIntent.getService(this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
        ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(mGoogleActclient, 0, mActivityRecognitionPendingIntent);  
        }

    @Override
    public void onConnectionSuspended(int arg0) {
        textView1.setText("Failed Suspended" + arg0);
        }

    private BroadcastReceiver receiver = new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(getApplicationContext(), "Service", Toast.LENGTH_SHORT).show();
            String v =  "Activity :" + intent.getStringExtra("Activity") + " " + "Confidence : " + intent.getExtras().getInt("Confidence") + "\n";
            v += textView1.getText() ;
            textView1.setText(v);
            }
        };

    @Override
    public void onDisconnected() {
        textView1.setText("Disconnected" ); 
        }
    }

マニフェスト

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".Actrecogex"
        android:label="@string/app_name" >
        <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.gms.version" android:value="@integer/google_play_services_version"/>
    <service android:name="ActivityRecognitionIntentService" android:exported="false"></service>
</application>

コードは本当に機能しますか、それとも時間を無駄にしていますか。真剣にActivityrecognitionclientに戻りたいです。Gingerbread と Kitkat でアプリをテストします。どちらもブレない

4

2 に答える 2

0

マニフェストでのサービスの定義が間違っているようです。先頭のピリオドがありません。そのはず

<service android:name=".ActivityRecognitionIntentService" android:exported="false"></service>

あなたのonHandleIntent()用途

intent.getAction() == "ActivityRecognitionIntentService"

ただし、文字列を比較することはできない==ため、ifステートメントが true を返すことはありません。代わりに、equals()または同等のTextUtils.equals()を使用する必要があります(どちらかの引数が の場合も処理しますnull)。

"ActivityRecognitionIntentService".equals(intent.getAction())
// OR
TextUtils.equals(intent.getAction(), "ActivityRecognitionIntentService")
于 2015-01-21T05:01:14.660 に答える
0
 if (intent.getAction() == "ActivityRecognitionIntentService") {
}

null値を与えていました。したがって、定期的なエラーメッセージ。

主な問題は、Broadcastreceiver が何も受信していないことでした。そのため、Broadcastreceiver 用に別のクラスが必要でした。それは今働いています。

<receiver android:name="ActBreceiver" android:exported="false">
            <intent-filter>
                <action android:name="ACTIVITY_RECOGNITION_DATA"/>
            </intent-filter>
        </receiver>
于 2015-01-25T14:22:43.937 に答える