我想在我的应用中添加计步器。
现在,我正在使用Google fit来测量用户步数。

我面临的问题是,并非所有设备都安装了Google Fit应用程序,即使安装了Google fit应用程序,也不是所有用户都注册了应用程序服务(作为客户端)。

因此,所需的流程是:

  • 检测是否安装了Google fit应用程序。
  • 如果已安装,请检查用户是否已注册Google fit应用程序。
  • 如果已安装并注册到ojit_code应用程序,请检查用户帐户类型支持是否在使用健身服务。 (记录诸如步骤之类的数据)
  • 如果以上都可以,请检查用户是否确认了“Google fit”弹出窗口。

  • 基本上我想检查用户是否使用fit app(使用上述所有条件),如果一个失败,则它将使用设备上的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> {
        ...
    }
    }
    

    需要你们的帮助

    谢谢。

    最佳答案

    您可以在getPackageInfo()上调用PackageManager。如果抛出PackageManager.NameNotFoundException,则表示未安装该应用程序。如果没有异常,则说明已安装Google Fit

    private static final String PACKAGE_NAME = "com.google.android.apps.fitness";
    
    @CheckResult public boolean fitInstalled() {
        try {
            context.getPackageManager().getPackageInfo(PACKAGE_NAME, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            return false;
        }
    }
    

    10-07 18:58
    查看更多