在谷歌飞度的应用程序,在安装时,测量你在走路或跑步的时间,也步数所有的时间.然而,奇怪的是,使用它似乎并没有耗尽电池.其他应用程序,如Moves,似乎可以非常准确地记录步数,因为它不断监控GPS和加速度计,因此它会消耗大量功率.
我想象几种可能性:
该应用程序仍然感觉神奇.一直计数步骤而没有可察觉的电池消耗.
我目前正在尝试使用Google Fit API.这是我第一个使用API的应用,我主要是关注Google的文档.
下面是我的代码似乎有问题
我遇到的问题是它似乎没有更新步骤计数器.
public class MainActivity extends Activity
implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = "FitActivity";
//[START Auth_Variable_References]
private static final int REQUEST_OAUTH = 1;
// [END auth_variable_references]
private GoogleApiClient mClient = null;
int mInitialNumberOfSteps = 0;
private TextView mStepsTextView;
private boolean mFirstCount = true;
// Create Builder View
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStepsTextView = (TextView) findViewById(R.id.textview_number_of_steps);
}
private void connectFitness() {
Log.i(TAG, "Connecting...");
// Create the Google API Client
mClient …Run Code Online (Sandbox Code Playgroud) 我遵循此处描述的相同步骤 (Google Fit客户端连接部分工作正常).
final DataType dataType=TYPE_STEP_COUNT_DELTA;
DataSourcesRequest requestData = new DataSourcesRequest.Builder()
.setDataTypes(dataType) // At least one datatype must be specified.
.build();
Fitness.SensorsApi.findDataSources(mClient, requestData)
.setResultCallback(new ResultCallback<DataSourcesResult>() {
@Override
public void onResult(DataSourcesResult dataSourcesResult) {
Log.i(TAG, "Result: " + dataSourcesResult.getDataSources().size() + " sources "
+ dataSourcesResult.getStatus().toString());
for (DataSource dataSource : dataSourcesResult.getDataSources()) {
Log.i(TAG, "Data source found: " + dataSource.toString());
Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName());
}
}
});
Run Code Online (Sandbox Code Playgroud)
当我要求数据源时,我只得到一个结果就是智能手机.如果我添加一个监听器,那么我真的得到数据,所以它正在工作.
不过它也可以通过手机与Android Wear智能手表Gear Live和Android Wear应用程序连接.Google Fit已安装在两者中,但我想从智能手表获取数据.
在我阅读的官方指南中
Sensors API提供对Android设备上可用传感器以及可穿戴设备等配套设备中可用传感器的原始传感器数据流的访问 . …
我正在使用演示应用程序来使用Google Fit获取当前活动示例.我可以正确地获得速度和距离.但是,尽管我处于同一状态,但它并没有经常返回"in_vehicle"或"骑自行车"状态.找到相同的附加截图.我的速度为59.40KM/H(36.91 M/h),当时它没有返回"in_vehicle"活动状态.
请提供相同的解决方案/反馈.
代码:
@Override
public void onDataPoint(DataPoint dataPoint) {
for (Field field : dataPoint.getDataType().getFields()) {
Value val = dataPoint.getValue(field);
if(field.getName().trim().toLowerCase().equals("activity"))
{
if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("biking"))
{
strState = "Cycling";
}
else if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("in_vehicle"))
{
strState = "Automotive";
}
else if(FitnessActivities.getName(Integer.parseInt(val.toString())).equals("walking"))
{
strState = "Walking";
}
else
{
strState = "Not Moving";
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在尝试设置一个在 WearOS 上运行的可穿戴应用程序(适用于华为 Watch 2),以将心率 (BPM) 持续提供到 Google Fit 帐户中,该帐户会被读入另一个智能手机应用程序中。
当我尝试设置帐户并访问数据时出现问题,如下所示:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.BODY_SENSORS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.BODY_SENSORS),GOOGLE_FIT_PERMISSIONS_REQUEST_CODE)
}
fitnessOptions = FitnessOptions.builder()
.addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_READ)
.addDataType(DataType.TYPE_HEART_RATE_BPM, FitnessOptions.ACCESS_WRITE)
.build()
account = GoogleSignIn.getAccountForExtension(this, fitnessOptions)
if (!GoogleSignIn.hasPermissions(account, fitnessOptions)) {
GoogleSignIn.requestPermissions(
this, // your activity
GOOGLE_FIT_PERMISSIONS_REQUEST_CODE, // e.g. 1
account,
fitnessOptions);
} else {
accessGoogleFit()
}
timer.scheduleAtFixedRate(
object : TimerTask() {
override fun run() {
Log.i("[TimerTask]", "Retrieving data..")
accessGoogleFit()
Log.i("[Account]", "" + account.email)
}
},0, 1000
) …Run Code Online (Sandbox Code Playgroud) 我开发了一个需要显示每日步数的应用程序.为此,我使用了Google Fit SDK中提供的API.
一切似乎都正常,但我得到的步数与Google Fit官方应用程序中显示的步数不匹配.
例如,当Google Fit App显示2367步时,我会获得2308步.
是否有一个原因?有没有人有同样的问题?有人有线索吗?
一个众所周知的问题是,许多Android手机在屏幕关闭时关闭加速度计.然而Android Fit(应用程序)似乎发生了一些变化.即使屏幕熄灭,Fit也会保持计数步数.如果安装了Fit,则会在Fit环境中引发事件以进行步数计数,并且我可以使用它来捕获它们
Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
.setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE)
Run Code Online (Sandbox Code Playgroud)
我在三星S4和Oneplus One上测试了这个,在这两种情况下都计算了步数.他们是怎么做到的?他们使用什么Android类?我的理解是,自Kitkat以来引入的可用方法是实现SensorEventListener.例如,theelfismike提供了实现此功能的代码.然而,在许多手机上,当屏幕熄灭时,步数会停止.有趣的是,如果安装了Google Fit应用程序,计数似乎并没有停止(因此我猜他们会保持加速度计开启).
我错过了什么吗?屏幕关闭后保持计数步骤的功能是否可供凡人程序员使用?谢谢!
从智能手机使用HistoryAPI如果我询问用户的历史记录和DataType.TYPE_HEART_RATE_BPM最后一个小时,从当前时间开始,我错过了过去半小时的数据.
如果我使用智能手表中的相同程序向Google Fit询问它们,那就没关系了.
所以这不是数据提取的问题,因为它取决于设备.
也许这是同步问题?如何以编程方式强制更新Google Fitness Store存储库中的记录?
这就是我所说的.
编辑:这是我建立请求的方式
DataReadRequest readRequest = new DataReadRequest.Builder()
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.enableServerQueries()
.read(dataType)
.build();
Run Code Online (Sandbox Code Playgroud) 不知何故,我已经陷入了谷歌健康Android SDK的死胡同.目前,我正在构建一个应用程序,用于读取,显示和处理来自Google Fit的数据,以便用户了解其锻炼行为.
我的情况如下:我曾经在Google Pixel上进行测试 - 一切都很好,我收到了来自Google Fit的所有(超过20个)会话.一周前,我已经切换到HTC10 - 在这个设备上我只收到来自Google Fit的4个(!)会话 - 相同的应用程序,相同的代码,相同的Google Fit帐户(在Google Fit应用程序中我仍然可以看到所有训练和训练).我试图阅读的会话不是使用我的应用程序创建的,而是使用Google Fit应用程序本身创建的.但是,在旧手机上,我可以阅读它们,在新手机上我不能.
让我粘贴一些代码以便更清晰.
GoogleApiClient设置
googleApiClient = GoogleApiClient.Builder(context)
.addApi(Fitness.HISTORY_API)
.addApi(Fitness.SESSIONS_API)
.addApi(Fitness.RECORDING_API)
.addApi(Fitness.GOALS_API)
.addScope(Scope(Scopes.FITNESS_ACTIVITY_READ_WRITE))
.addScope(Scope(Scopes.FITNESS_BODY_READ_WRITE))
Run Code Online (Sandbox Code Playgroud)
连接后,我订阅了几个RecordingApis( ,TYPE_WORKOUT_EXERCISE,)TYPE_WEIGHTTYPE_CALORIES_EXPENDED
SessionReadRequest:
val sessionRequest = SessionReadRequest.Builder()
.setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
.read(DataType.TYPE_WORKOUT_EXERCISE)
.readSessionsFromAllApps()
.enableServerQueries()
.build()
Run Code Online (Sandbox Code Playgroud)
阅读会议:
Fitness.SessionsApi.readSession(googleApiClient, sessionRequest)
.setResultCallback { result ->
Timber.d("Sessions result: %s", result.status)
Timber.d("Got %d sessions", result.sessions.size) // returns only 4! for 2014-NOW timerange
}
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
我正在努力显示与 Google Fit 应用程序相同的活动历史记录。我在会话方面做得很好,但我无法正确掌握自动记录的活动。就像示例中的这两个顶级步行。
我认为一切都归结DataReadRequest为建造的方式。我得到的最接近的是:
DataReadRequest.Builder()
.aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
.bucketByActivitySegment(5, TimeUnit.MINUTES)
.setTimeRange(dateFrom.millis, dateTo.millis, TimeUnit.MILLISECONDS)
.build()
Run Code Online (Sandbox Code Playgroud)
故意排除少于 5 次步行。结果相似,但结果略有不同。持续时间和大卡减少约 20%。有时它真的很疯狂,将活动切成小块。我在 Google Fit 中走了 2 次,最终在我的应用程序中走了 4 次,这与 Google Fit 中的 2 次不相加。我试图反编译 Google Fit 应用程序以“借用”请求设置,但该应用程序被很好地混淆了。:)
有人实现了吗?