是否可以检测用户是否安装并使用了Google健身应用?

时间:2015-12-15 14:52:01

标签: android google-fit

我想在我的应用中添加步数计数器。 到目前为止,我使用Google fit来衡量用户步数。

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

所以期望的流程是:

  1. 检测是否安装了Google fit应用。
  2. 如果已安装,请检查用户是否已注册到Google fit app。
  3. 如果已安装并注册到Google fit应用,请检查用户帐户类型是否支持使用健身服务。 (记录步骤等数据)
  4. 如果一切正常,请检查用户是否已确认“Google fit弹出窗口。
  5. 基本上我想检查用户是否使用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> {
        ...
    }
    }
    

    需要你的帮助,

    感谢。

2 个答案:

答案 0 :(得分:4)

您可以在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;
    }
}

答案 1 :(得分:0)

这是Kotlin版本

fun checkIfFitInstalled(): Boolean {
    try {
        applicationContext.packageManager.getPackageInfo("com.google.android.apps.fitness", PackageManager.GET_ACTIVITIES)
        return true
    } catch (e: Exception) {
        return false
    }
}