簡體   English   中英

Google+登錄在Android片段上無法正常使用

[英]Google+ Login Not working properly on Android fragment

我正在使用谷歌+登錄到我的應用程序,當我使用活動完成它的工作魅力,然后我將我的代碼移動到一個片段,然后當我嘗試登錄到谷歌+它不工作我必須打開片段活動2次登錄谷歌+任何人都可以告訴我,下面添加了片段的代碼發生了什么

public class GooglePluseFragment extends Fragment implements
        ConnectionCallbacks, OnConnectionFailedListener {

private static final int RC_SIGN_IN = 0;

private static final String TAG = "MainActivity";

private static final int PROFILE_PIC_SIZE = 800;

private GoogleApiClient mGoogleApiClient;

private boolean mIntentInProgress;

private boolean mSignInClicked;

private ConnectionResult mConnectionResult;

private SignInButton btnSignIn;
private Button btnSignOut;

private Context mContext;
private Activity mActivity;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mActivity = getActivity();
    mContext = getActivity().getApplicationContext();
}

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

    View view = inflater.inflate(R.layout.compund_google_pluse_fragment,
            container, false);

    btnSignIn = (SignInButton) view.findViewById(R.id.btn_sign_in);
    btnSignOut = (Button) view.findViewById(R.id.btn_sign_out);

    sharedPref = view.getContext().getSharedPreferences(
            Constantz.SHEARED_PREFEREANCE, Context.MODE_PRIVATE);

    mGoogleApiClient = new GoogleApiClient.Builder(view.getContext())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).addApi(Plus.API, null)
            .addScope(Plus.SCOPE_PLUS_LOGIN).build();

    btnSignIn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            signInWithGplus();

        }
    });

    btnSignOut.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            signOutFromGplus();
        }
    });

    return view;
}

@Override
public void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

@Override
public void onStop() {
    super.onStop();
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

@Override
public void onActivityResult(int requestCode, int responseCode,
        Intent intent) {

    if (requestCode == RC_SIGN_IN) {
        if (responseCode != Activity.RESULT_OK) {
            mSignInClicked = false;
        }

        mIntentInProgress = false;

        if (!mGoogleApiClient.isConnecting()) {
            mGoogleApiClient.connect();

        }
    }
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    if (!result.hasResolution()) {
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(),
                mActivity, 0).show();
        Log.e(TAG, "" + result.getErrorCode());
        return;
    }

    if (!mIntentInProgress) {

        mConnectionResult = result;

        if (mSignInClicked) {

            Log.e(TAG, "" + result.getErrorCode());
            resolveSignInError();
        }
    }

}

@Override
public void onConnected(Bundle arg0) {
    mSignInClicked = false;

    getProfileInformation();

    updateUI(true);

}

@Override
public void onConnectionSuspended(int arg0) {
    mGoogleApiClient.connect();
    updateUI(false);

}

private void updateUI(boolean isSignedIn) {
    if (isSignedIn) {
        btnSignIn.setVisibility(View.GONE);
        btnSignOut.setVisibility(View.VISIBLE);

    } else {
        btnSignIn.setVisibility(View.VISIBLE);
        btnSignOut.setVisibility(View.GONE);

    }
}

/**
 * Sign-in into google
 * */
private void signInWithGplus() {
    if (!mGoogleApiClient.isConnecting()) {
        mSignInClicked = true;
        resolveSignInError();
    }
}

/**
 * Method to resolve any signin errors
 * */
private void resolveSignInError() {
    if (mConnectionResult.hasResolution()) {
        try {
            mIntentInProgress = true;
            mConnectionResult.startResolutionForResult(mActivity,
                    RC_SIGN_IN);
        } catch (SendIntentException e) {
            mIntentInProgress = false;
            mGoogleApiClient.connect();
        }
    }
}

/**
 * Fetching user's information name, email, profile pic
 * */
private void getProfileInformation() {
    try {
        if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
            Person currentPerson = Plus.PeopleApi
                    .getCurrentPerson(mGoogleApiClient);
            String personName = currentPerson.getDisplayName();
            String personPhotoUrl = currentPerson.getImage().getUrl();
            String personGooglePlusProfile = currentPerson.getUrl();
            String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

            Log.e(TAG, "Name: " + personName + ", plusProfile: "
                    + personGooglePlusProfile + ", email: " + email
                    + ", Image: " + personPhotoUrl + " user id:"
                    + currentPerson.getId());






        } else {
            Toast.makeText(mContext, "Person information is null",
                    Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

/**
 * Sign-out from google
 * */
private void signOutFromGplus() {
    if (mGoogleApiClient.isConnected()) {
        Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
        mGoogleApiClient.disconnect();
        mGoogleApiClient.connect();

        updateUI(false);

    }
}

}

這就是我在片段活動中添加framgent的方式

pluseFragment = new GooglePluseFragment();

        FragmentManager manager = getSupportFragmentManager();

        FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.pluse_frame_layout, pluseFragment);
transaction.commit();

誰能告訴我我做錯了什么? 為什么我要打開活動兩次才能登錄謝謝

最后找到答案,問題是當片段中的結果活動調用被父活動捕獲時,您必須手動將結果重定向到片段。 只需在父片段活動中添加此行

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == GooglePluseFragment.RC_SIGN_IN) {
            GooglePluseFragment fragment = (GooglePluseFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.pluse_frame_layout);
            fragment.onActivityResult(requestCode, resultCode, data);
        } else {
            super.onActivityResult(requestCode, resultCode, data);
        }
    } 

簡單的解決方案::只需在片段中創建靜態方法“

public static myOnActivityResult(int requestCode, int resultCode, Intent data){
.....Enter same code
} 

從Parant Activity調用此方法

     protected void onActivityResult(int requestCode, int resultCode, Intent data) {

.....
MyFragment.myOnActivityResult(requestCode,resultCode,data)

}

而已

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM