Java 让GoogleAppClient与活动识别一起工作

Java 让GoogleAppClient与活动识别一起工作,java,android,eclipse,google-api-client,activity-recognition,Java,Android,Eclipse,Google Api Client,Activity Recognition,我目前正在使用ActivityRecognitionClient,但不幸的是,Google已经宣布该类已被弃用,并改用GoogleAppClient 不确定我是否做错了,我对新的API文件感到困惑。我已经导入了Google Play库,设置了API v2密钥。我跟踪了一个在线消息来源,对ActivityRecognitionClient版本进行了编码 下面是不同文件的代码,每当我将tab切换到actRecog时,它就会崩溃,并将错误指向这一行,同时出现空指针异常 mActivityRecogni

我目前正在使用ActivityRecognitionClient,但不幸的是,Google已经宣布该类已被弃用,并改用GoogleAppClient

不确定我是否做错了,我对新的API文件感到困惑。我已经导入了Google Play库,设置了API v2密钥。我跟踪了一个在线消息来源,对ActivityRecognitionClient版本进行了编码

下面是不同文件的代码,每当我将tab切换到actRecog时,它就会崩溃,并将错误指向这一行,同时出现空指针异常

mActivityRecognitionPendingIntent = PendingIntent.getService(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
完整的源代码如下:出于隐私目的,API v2密钥被故意隐藏

MainActivity.java

package com.example.healthgps;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.app.Activity;
import android.app.TabActivity;
import android.content.Context;
import android.content.Intent;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;

public class MainActivity extends TabActivity  {

TabHost mTabHost;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);


    setContentView(R.layout.activity_main);
    mTabHost = getTabHost();

    TabSpec firstSpec = mTabHost.newTabSpec("Stats");
    firstSpec.setIndicator("Stats");
    Intent firstIntent = new Intent(this, FirstActivity.class);
    firstSpec.setContent(firstIntent);

    TabSpec thirdSpec = mTabHost.newTabSpec("ActRecog");
    thirdSpec.setIndicator("ActRecog");
    Intent thirdIntent = new Intent(this, activityrecignition.class);
    thirdSpec.setContent(thirdIntent);

    mTabHost.addTab(firstSpec);
    mTabHost.addTab(thirdSpec);

  }

}
清单XML文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.healthgps"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <permission 
        android:name="com.example.healthgps.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>
    <uses-permission android:name="com.example.healthgps.permission.MAPS_RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />



    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />


        <activity
            android:name="com.example.healthgps.MainActivity"
            android:label="Health Kit" 
            android:screenOrientation="portrait" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".FirstActivity"
            android:label="Health Kit" >
        </activity>
        <activity
            android:name=".activityrecignition"
            android:label="Health Kit" >
        </activity>

        <service
            android:name="com.example.healthgps.ActivityRecognitionIntentService"
            android:label="@string/app_name"
            android:exported="false">
        </service>


    <meta-data  
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

    </application>
</manifest>
在旧代码中,它包含ActivityRecognitionClient需要实例化的部分,但GoogleAppClient没有

是否有人已经设法切换到新的API?我需要一些向导去那里。
谢谢。

您必须按以下方式使用GoogleAppClient.Builder

GoogleApiClient.Builder builder = new GoogleApiClient.Builder(<context>)
            .addApi(<some api, i.e LocationServices.API>)
            .addConnectionCallbacks(new ConnectionCallbacks() {

                @Override
                public void onConnectionSuspended(int arg) {}

                @Override
                public void onConnected(Bundle arg0) {
                    Intent intent = new Intent(getApplicationContext(),      ActivityRecognitionService.class); // your custom ARS class
                    mPendingIntent = PendingIntent.getService(getApplicationContext(), 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

            ActivityRecognition.ActivityRecognitionApi
                    .requestActivityUpdates(mGoogleApiClient, ACTIVITY_RECOGNITION_INTERVAL, mPendingIntent);}

            }
            .addOnConnectionFailedListener(new OnConnectionFailedListener() {

                @Override
                public void onConnectionFailed(ConnectionResult arg0) {

                }
            });

mGoogleApiClient = builder.build();

mGoogleApiClient.connect();

对不起,我不太明白这东西是怎么用的?确切地说,我应该把这个代码放在哪里*P/S:顺便说一下,addOnConnectionFailedListener缺少一个括号。正如你自己所说的,你从来没有初始化过你的GoogleAppClient!此代码,即,在确保设备上安装了GPS后,应立即进行初始化。至于您的例外情况,您也不会为McContext分配任何内容。顺便说一句,在我添加的代码中,您可以看到挂起的意图仅在GoogleAppClient的OnConnectiond回调中延迟创建。
GoogleApiClient.Builder builder = new GoogleApiClient.Builder(<context>)
            .addApi(<some api, i.e LocationServices.API>)
            .addConnectionCallbacks(new ConnectionCallbacks() {

                @Override
                public void onConnectionSuspended(int arg) {}

                @Override
                public void onConnected(Bundle arg0) {
                    Intent intent = new Intent(getApplicationContext(),      ActivityRecognitionService.class); // your custom ARS class
                    mPendingIntent = PendingIntent.getService(getApplicationContext(), 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

            ActivityRecognition.ActivityRecognitionApi
                    .requestActivityUpdates(mGoogleApiClient, ACTIVITY_RECOGNITION_INTERVAL, mPendingIntent);}

            }
            .addOnConnectionFailedListener(new OnConnectionFailedListener() {

                @Override
                public void onConnectionFailed(ConnectionResult arg0) {

                }
            });

mGoogleApiClient = builder.build();

mGoogleApiClient.connect();