2015-12-15 5 views
5

私は自分のアプリにステップカウンターを追加したいと思います。 今私はGoogle fitを使用してユーザーステップ数を測定しています。Google Fitアプリがユーザーによってインストールされ使用されているかどうかを検出できますか?

私が直面している問題は、すべてのデバイスにGoogle Fitアプリがインストールされているわけではなく、すべてのユーザーが(クライアントとして)アプリサービスに登録するわけではありません。

だから、所望の流れは次のとおりです。Google fitアプリがインストールされている場合

  1. を検出します。
  2. インストールされている場合は、ユーザーがGoogle fitアプリに登録されているかどうかを確認してください。
  3. Google fitアプリにインストールして登録している場合は、ユーザーアカウントタイプのサポートでフィットネスサービスを使用しているかどうかを確認してください。 (ステップなどのデータを記録する)
  4. 上記の内容がすべて「OK」の場合は、「Google fit」のポップアップを確認してください。

基本的には、ユーザーがフィットアプリを使用しているかどうかをチェックしたい場合は(上のすべての条件を使用して)、失敗した場合はデバイスのステップカウントセンサーを使用しますこの目標を達成するために他のセンサーを使用してください。

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> { 
    ... 
} 
} 

必要あなたの助けみんな、

ありがとう:ここ

は、私はGoogleのフィットのAPIと接続するために使用しているコードです。

+0

私は同じ問題に直面していますか? – shekar

+0

同じ質問に対する解決策も探しています。あなたがすでにそれを持っている場合、答えを投稿してください。 –

答えて

4

PackageManagergetPackageInfo()と電話することができます。 PackageManager.NameNotFoundExceptionがスローされた場合は、アプリがインストールされていないことを意味します。例外がスローされない場合は、Googleがインストールされています

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; 
    } 
} 
関連する問題