2017-02-09 1 views
4

TabLayout ViewPagerフラグメントを使用してGoogle Signupを統合したいとします。 ViewPagerには、LoginFragmentとRegistrationFragmentの2つのフラグメントがあり、両方に「Google Signup」ボタンが含まれています。TabLayout ViewPagerを使用しているときに「既にID 0のGoogleApiClientを管理しています」というメッセージが表示される

問題は、アクティビティを開始するときに次のエラーが発生することです。

java.lang.IllegalStateException:すでに私は、次のコード

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

// Configure sign-in to request the user's ID, email address, and basic 
// profile. ID and basic profile are included in DEFAULT_SIGN_IN. 
     gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
       .requestEmail() 
       .build(); 

     buildGoogleApiClient(); 

    // ..... 
} 

private synchronized void buildGoogleApiClient() { 
    /** build_client */ 
    try { 
     mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
       .enableAutoManage(getActivity() /* FragmentActivity */, this /* OnConnectionFailedListener */) 
       .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
       .build(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

をしようとしている

java.lang.IllegalStateException: Already managing a GoogleApiClient with id 0 
at com.google.android.gms.common.internal.zzac.zza(Unknown Source) 
at com.google.android.gms.internal.zzzt.zza(Unknown Source) 
at com.google.android.gms.common.api.GoogleApiClient$Builder.zzf(Unknown Source) 
at com.google.android.gms.common.api.GoogleApiClient$Builder.build(Unknown Source) 
at com.naturesouq_shopping.fragment.RegistrationFragment.buildGoogleApiClient(RegistrationFragment.java:174) 
at com.naturesouq_shopping.fragment.RegistrationFragment.getIds(RegistrationFragment.java:140) 
at com.naturesouq_shopping.fragment.RegistrationFragment.onCreateView(RegistrationFragment.java:85) 
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298) 
at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323) 
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136) 
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2092) 
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1969) 
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620) 
at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:166) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1268) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1116) 
at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1642) 
at android.view.View.measure(View.java:20236) 

対数ID 0

完全な誤りでGoogleApiClient を管理および

@Override 
public void onStart() { 
    super.onStart(); 
    if (mGoogleApiClient != null) { 
     mGoogleApiClient.connect(); 
    } 

} 

@Override 
public void onStop() { 
    Log.d("GARG", "***** on Stop ***** "); 
    if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) { 
     Log.d("GARG", "***** on Stop mGoogleApiClient disconnect ***** "); 

     mGoogleApiClient.stopAutoManage(getActivity()); 
     mGoogleApiClient.disconnect(); 
    } 
    super.onStop(); 
} 

Google APIクライアントに接続する別の方法はありますか? 私はどこで間違って正しい方法を行っていますか?

答えて

8

私はすでにビルドされて接続されているgoogleApiClientを使ってビルドしようとしています。これはあなたの問題を解決することがあります。

if(mGoogleApiClient == null || !mGoogleApiClient.isConnected()){ 
try { 
    mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
      .enableAutoManage(getActivity() /* FragmentActivity */, this /* OnConnectionFailedListener */) 
      .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
      .build(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
} 
+0

このアプローチの問題はRegistrationFragmentが既に構築され、LoginFragmentで接続されたGoogleApiClientを取得しようとすると、それは静かにただ失敗だろうとmGoogleApiClientを使用して、後でRegistrationFragmentのコードがある場合、それはNPEをスローされますです。 – vlazzle

+0

問題に特化しようとしています。私はOPのコードを勉強したときに、穴があった場所だと信じていました。 – Journey

+0

あなたのコードはOPコードの問題を解決するので良いコードですが、より良いコードでも将来の問題を避けることができます。 – vlazzle

6

official doc for enableAutoManageはこれを言う:

任意の時点で、唯一の自動管理クライアントをIDごとに許可されます。 IDを再利用するには、前のクライアントでstopAutoManage(FragmentActivity)を最初に呼び出す必要があります。

あなたのコードは、のclientIdパラメータなしenableAutoManageのバージョンを使用しているので、あなたは、上記のドキュメントはに対して警告しているものであるのclientId 0、のために複数の自動管理クライアントを持つことになりますなぜ私は説明の下には、それが0に不履行です。

Fragmentの1つがFragmentActivityに添付されると、そのアクティビティにGoogleApiClientの新しいインスタンスの管理を開始するよう指示されます。しかし、FragmentActivityが既にGoogleApiClientの別のインスタンスを管理している場合はどうでしょうか?これでエラーが発生します。

あなたのケースでは、ViewPagerを含むFragmentActivityは、2つの異なるGoogleApiClient(RegistrationFragmentのものとLoginFragmentのもの)を管理するように求められます。スタックトレースによると、FragmentActivityはまずLoginFragmentのGoogleApiClientを管理し始め、その後、RegistrationFragmentのGoogleApiClientを管理するように要求したときにクラッシュしました。

  • 峠enableAutoManageには、2つの異なるClientIDが、LoginFragment用とReservationFragmentのための別:

    あなたはいくつかのことを試みることができます。

  • stopAutoManageを呼び出す必要がある場所を特定します。これは、ViewPagerのFragmentsでは難しいかもしれません。
  • 私があなただったら、私は真剣に、RegistrationFragmentとLoginFragmentではなくViewPagerを含むFragmentActivityでGoogleApiClientを作成することを検討します。その後、活動のGoogleApiClientを必要とする作業を行う、またはそのような活動からGoogleApiClientを取得した後、両方のフラグメントでそれを行うために続けることができるのいずれか:

プライベートGoogleApiClient googleApiClient。

@Override 
    void onAttach(Activity activity) { 
     super.onAttach(activity); 
     googleApiClient = activity.getGoogleApiClient(); 
    } 

    @Override 
    void onDetach() { 
     super.onDetach(); 
     googleApiClient = null; 
    } 
関連する問題