【问题标题】:Does Android ActivityRecognitionApi work , No Updates received on onHandleIntentAndroid ActivityRecognitionApi 是否工作,onHandleIntent 上没有收到更新
【发布时间】:2015-01-21 04:55:54
【问题描述】:

各位有没有人得到 ActivityrecognitionAPI 以在 Android 中工作。它不提供任何更新。已经尝试过 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>

代码真的有效吗,或者我在浪费时间。真心想回去Activityrecogntionclient。在 Gingerbread 和 Kitkat 上测试应用程序。两个都不让步

【问题讨论】:

  • 现在发现问题出在哪里 ActivityRecognitionResult 是罪魁祸首。现在能够从中得到一个错误。所以 onHandleIntent 踢但抛出错误。
  • 我在姜饼中定期收到 Forceclose 错误消息,但在 Kitkat 中没有。我认为的周期性错误消息是来自服务的活动反馈。

标签: android broadcastreceiver intentservice activity-recognition


【解决方案1】:

您在 Manifest 中对服务的定义似乎是错误的:它缺少前导句点。应该是

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

【讨论】:

  • 感谢您指出这一点。问题是 OnHandleIntent 永远不会被调用。改成equals(),结果一样
  • 更新了我的答案:看起来您的清单服务定义也需要更正。
  • 添加前导句点 .ActivityRecognitionIntentService 没有区别,同样的问题
  • 删除exported="false" 属性后会发生什么?
  • Exported = false 是为了安全。如果我删除没有变化。我收到定期错误消息,我认为这是活动更新。当我删除 ActivityRecognitionResult 时错误停止。所以错误仅来自于此。
【解决方案2】:
 if (intent.getAction() == "ActivityRecognitionIntentService") {
}

给出空值。所以周期性的错误消息。

主要问题是广播接收器没有收到任何东西。所以需要有单独的广播接收器类。它现在正在工作。

<receiver android:name="ActBreceiver" android:exported="false">
            <intent-filter>
                <action android:name="ACTIVITY_RECOGNITION_DATA"/>
            </intent-filter>
        </receiver>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-08
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2017-01-27
    相关资源
    最近更新 更多