sha*_*ooo 6 android google-fit
我想在我的应用程序中添加步骤计数器.到现在为止,我正在Google fit测量用户步数.
我面临的问题是,并非所有设备都Google Fit安装了应用程序,即使是 - 并非所有用户都注册到应用程序服务(作为客户端).
所以期望的流程是:
Google fit安装了应用程序.Google fit应用程序.Google fit应用程序,请检查用户帐户类型支持是否使用健身服务.(记录步骤等数据)基本上我想如果用户使用健身应用(使用上述所有条件)来检查,如果一个失败,则它将使用STEPCOUNT传感器上设备(如果存在),如果传感器不存在,将使用其他传感器的实现这个目标.
以下是我用来连接Google Fit API的代码:
private void buildFitnessClient() {
// Create the Google API Client
mClient = new GoogleApiClient.Builder(getContext())
.addApi(Fitness.HISTORY_API)
.addScope(new Scope(Scopes.FITNESS_ACTIVITY_READ))
.addConnectionCallbacks(
new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Log.i(TAG, "Connected!!!");
// Now you can make calls to the Fitness APIs.
// Put application specific code here.
new getFitnessTask().execute();
}
@Override
public void onConnectionSuspended(int i) {
// If your connection to the sensor gets lost at some point,
// you'll be able to determine the reason and react to it here.
if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_NETWORK_LOST) {
Log.i(TAG, "Connection lost. Cause: Network Lost.");
} else if (i == GoogleApiClient.ConnectionCallbacks.CAUSE_SERVICE_DISCONNECTED) {
Log.i(TAG, "Connection lost. Reason: Service Disconnected");
}
}
}
)
.addOnConnectionFailedListener(
new GoogleApiClient.OnConnectionFailedListener() {
// Called whenever the API client fails to connect.
@Override
public void onConnectionFailed(ConnectionResult result) {
Log.i(TAG, "Connection failed. Cause: " + result.toString());
if (!result.hasResolution()) {
// Show the localized error dialog
if (getActivity() != null) {
GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(),
getActivity(), 0).show();
}
return;
}
// The failure has a resolution. Resolve it.
// Called typically when the app is not yet authorized, and an
// authorization dialog is displayed to the user.
if (!authInProgress) {
try {
Log.i(TAG, "Attempting to resolve failed connection; activity; "+ getActivity());
if (getActivity() != null) {
authInProgress = true;
result.startResolutionForResult(getActivity(),
REQUEST_OAUTH);
}
} catch (IntentSender.SendIntentException e) {
Log.e(TAG,
"Exception while starting resolution activity", e);
}
}
}
}
)
.build();
}
public void onActivityResult(int requestCode, int resultCode, Intent data){
Log.e(TAG, "onActivityResult requestCode=" + requestCode + ", resultCode=" + resultCode);
if (requestCode == REQUEST_OAUTH) {
authInProgress = false;
if (resultCode == Activity.RESULT_OK) {
Log.e(TAG, "RESULT_OK");
// Make sure the app is not already connected or attempting to connect
if (!mClient.isConnecting() && !mClient.isConnected()) {
mClient.connect();
}
} else if (resultCode == Activity.RESULT_CANCELED) {
Log.e(TAG, "RESULT_CANCELED");
}
}
}
private class getFitnessTask extends AsyncTask<Void, Void, Integer> {
...
}
}
Run Code Online (Sandbox Code Playgroud)
需要你帮助的人,
谢谢.
您可以getPackageInfo()拨打PackageManager. 如果抛出异常,PackageManager.NameNotFoundException则表示该应用程序尚未安装。如果没有抛出异常,则说明 google fit 已安装
fun fitInstalled(context: Context): Boolean {
val fitPackage = "com.google.android.apps.fitness"
return try {
if (Build.VERSION.SDK_INT >= 33) {
context.packageManager.getPackageInfo(
fitPackage,
PackageManager.PackageInfoFlags.of(PackageManager.GET_ACTIVITIES.toLong())
)
} else {
@Suppress("DEPRECATION")
context.packageManager.getPackageInfo(
fitPackage,
PackageManager.GET_ACTIVITIES
)
}
true
} catch (e: PackageManager.NameNotFoundException) {
false
}
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您的目标是 Android 11+,您需要告诉 Android 您正在查询以下目录中的 fit 包AndroidManifest.xml:
<manifest ...>
...
<queries>
<package android:name="com.google.android.apps.fitness" />
</queries>
</manifest>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1316 次 |
| 最近记录: |