Google Play 服务活动识别断开连接且没有任何错误

Posted

技术标签:

【中文标题】Google Play 服务活动识别断开连接且没有任何错误【英文标题】:Google Play services activity recognition disconnects without any error 【发布时间】:2015-12-29 00:17:21 【问题描述】:

我正在编写一个后台服务(由一个活动启动),它记录屏幕开/关事件和用户的活动。

对于活动,我正在使用 google api 客户端。该应用程序在 Moto G 手机上正常运行,即记录活动和屏幕,但在 HTC 一部手机上停止活动识别。

我对代码做了一些更新,但仍然存在活动识别在几分钟后停止的问题。正如另一位成员所建议的,我还导出了 android-support-v4.jarandroid-support-v7-appcompat.jar 文件,但问题仍然存在。

手机的位置信息已开启,但未开启省电模式。此外,我将我的 SDK 以及手机上的 google play 服务更新到最新版本,但几分钟后我的 api 客户端仍然断开连接。以下是我使用的代码文件。

请帮我纠正这个问题。我正在使用日食。

我的活动:

public class MyActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener 

    private PendingIntent pIntent;
    GoogleApiClient mGoogleApiClient;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mGoogleApiClient = new GoogleApiClient.Builder(this).addApi(ActivityRecognition.API).addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();
        mGoogleApiClient.connect();
        IntentFilter filter = new IntentFilter();
        filter.addAction("ACTIVITY_RECOGNITION");//For filtering
      


    @Override

    public void onConnected(Bundle arg0) 
        Intent intent = new Intent(this, ActivityRecognitionService.class);
        pIntent = PendingIntent.getService(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);
        ActivityRecognition.ActivityRecognitionApi.requestActivityUpdates(mGoogleApiClient, 0, pIntent);//0
    
    //@Override 
    public void onConnectionSuspended(int arg0) 
        // TODO Auto-generated method stub  
        mGoogleApiClient.connect(); //I found this recently, but still app doesn't works
     
    @Override
    public void onConnectionFailed(ConnectionResult result) 
        // TODO Auto-generated method stub

    

ActivityRecognitionService

public class ActivityRecognitionService extends IntentService 

    private String TAG = "appLogs...";
    private long fName;

    public ActivityRecognitionService() 
        super("My Activity Recognition Service");
    

    @Override
    protected void onHandleIntent(Intent intent) 
        if(ActivityRecognitionResult.hasResult(intent))
            ActivityRecognitionResult result = ActivityRecognitionResult.extractResult(intent);
            Log.i(TAG, getType(result.getMostProbableActivity().getType()) + "t" + result.getMostProbableActivity().getConfidence());
        
    

    private String getType(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.ON_FOOT)
            return "On Foot";
        else if(type == DetectedActivity.STILL)
            return "Still";
        else if(type == DetectedActivity.TILTING)
            return "Tilting";
        else if(type == DetectedActivity.RUNNING)
            return "Running";
        else if(type == DetectedActivity.WALKING)
            return "Walking";
        else
            return "";
    

【问题讨论】:

请将您的代码与 googler 编写的this repo 进行比较。 谢谢!我在比较。 结果如何? 代码正确,问题出在手机上。就像手机闲置一段时间一样,就没有活动记录(这是有道理的)。但在我的其他测试手机上,即使它们处于空闲状态,在固定时间间隔后(如 10 分钟后)仍能感知到活动 哪些测试手机?在 L 还是 M? 【参考方案1】:

正如我刚刚回答了here,看来没有办法了。手机“静止”一段时间后,活动报告将停止。

如果你想即使手机“静止”也要录音,我看到两种方法:

1) 完全依赖 ActivityRecognition API 并记录“静止”,直到 Google 服务检测到 SIGNIFICANT_MOTION 并且 ActivityRecognition 开始向您发送新的更新;

2) 编写自己的简单 StillActivityRecognitionService,当“官方”API 没有更新时启动。该服务应该监听加速度计传感器,解释传感器事件(偏离平均值、峰值等)并发送它的决定“静止”/“静止”。

【讨论】:

是的,这也是我从研究中发现的 :) 但是我刚刚发现另一部手机 LG 有同样的问题,我的意思是用户正在使用手机但一段时间后活动感应仍然停止,您有什么建议吗? 如果感应停止也没关系,因为这是 ActivityRecognition API 的一个特性。问题是它是否永远不会再次开始感应。我猜你走一会儿后 ActivityRecognition 会醒来并再次开始感应。所以正如我在我的答案中所写 - 两种方式:信任此服务或编写您自己的辅助,这可能会使用 AlarmManager 以所需的延迟唤醒手机,感应加速度计 1-5 秒,计算与平均值的偏差和将它的决定“仍然”或“未知”发送到广播接收器等等 但它在我的其他测试手机上完美运行。对我来说,当用户长时间静止时感应停止是有意义的,但一旦用户再次处于活动状态,那么应该有一个活动日志。这是我在 HTC 上观察到的。有什么建议?顺便说一句,我的应用程序是空白活动,它启动了许多服务,如位置感应等。除了活动之外,其他一切都运行良好 可能会添加一些日志,这样您就可以在它输入“onConnectionFailed”时进行操作。我也会在其中添加“mGoogleApiClient.disconnect()”

以上是关于Google Play 服务活动识别断开连接且没有任何错误的主要内容,如果未能解决你的问题,请参考以下文章

使用“Google Play 游戏服务”玩游戏时突然断开连接

为啥我登录谷歌play商店说啥与谷歌连接断开,稍后再试?求解答

当应用程序进入后台时,实时多人 Google Play 游戏服务对等方断开连接

如何从 Google Play 服务通知中检测意图

带有活动切换的 Google Play 游戏服务多人游戏

在服务中访问 Google Play 服务位置 API