android - 从 Google plus 集成中的另一项 Activity 中注销是行不通的

标签 android android-activity fragment google-plus

我正在关注这个 tutorial它工作正常,但在我的应用程序中,我有多个 Activity ,如 SplashActivity -->MainActivity-->MyNewMainActivity

MyNewMainActivtiy.java 包含 3 个 fragment ,如 SearchFragment--> NearbyFragment--> ProfileFragment

我已成功完成登录并获取个人资料信息并在 profileFragment 中设置名称和图片 我已经设置了一个注销按钮,从那里我想从 google plus 注销并返回到 LoginActivity 当我再次点击 googleplus 登录按钮时,它显示错误

 07-02 11:24:04.815: E/AndroidRuntime(24382): FATAL EXCEPTION: main
07-02 11:24:04.815: E/AndroidRuntime(24382): java.lang.NullPointerException
07-02 11:24:04.815: E/AndroidRuntime(24382):    at com.rstm.doctorrx.LoginActivity.resolveSignInError(LoginActivity.java:279)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at com.rstm.doctorrx.LoginActivity.signInWithGplus(LoginActivity.java:345)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at com.rstm.doctorrx.LoginActivity.onClick(LoginActivity.java:114)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at android.view.View.performClick(View.java:4222)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at android.view.View$PerformClick.run(View.java:17343)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at android.os.Handler.handleCallback(Handler.java:615)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at android.os.Looper.loop(Looper.java:137)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at android.app.ActivityThread.main(ActivityThread.java:4895)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at java.lang.reflect.Method.invokeNative(Native Method)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at java.lang.reflect.Method.invoke(Method.java:511)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
07-02 11:24:04.815: E/AndroidRuntime(24382):    at dalvik.system.NativeStart.main(Native Method)

LoginActivity.java

package com.rstm.doctorrx;

import java.util.ArrayList;

import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.IntentSender.SendIntentException;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;

import com.doctorrx.integration.FacebookService;
import com.doctorrx.integration.FacebookService.FacebookFriendListRequester;
import com.doctorrx.integration.UserContext;
import com.doctorrx.integration.Utils;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.ResultCallback;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.model.people.Person;

public class LoginActivity  extends Activity implements OnClickListener , FacebookFriendListRequester,
ConnectionCallbacks, OnConnectionFailedListener{

    /**
     * A flag indicating that a PendingIntent is in progress and prevents us
     * from starting further intents.
     */
    public static int socialLogin;
    private boolean mIntentInProgress;
    private ConnectionResult mConnectionResult;
    ImageButton cross_btn;
    ProgressDialog dialog;
    Button login_btn, signup_btn,google_btn,facbook_login_btn;
    private boolean mSignInClicked;
    private static final int RC_SIGN_IN = 0;
    private SharedPreferences mPrefs;
    // Logcat tag
        private static final String TAG = "MainActivity";

        // Google client to interact with Google API
        private static  GoogleApiClient mGoogleApiClient;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_login);
        cross_btn=(ImageButton)findViewById(R.id.cross_btn);
        login_btn=(Button)findViewById(R.id.login_btn);
        signup_btn=(Button)findViewById(R.id.register_btn);
        google_btn=(Button)findViewById(R.id.google_login_btn);
        facbook_login_btn=(Button)findViewById(R.id.facbook_login_btn);
        initialiseGoogleclient();
        facbook_login_btn.setOnClickListener(this);
        google_btn.setOnClickListener(this);
        login_btn.setOnClickListener(this);
        signup_btn.setOnClickListener(this);
        cross_btn.setOnClickListener(this);
//      try {
//          PackageInfo info = getPackageManager().getPackageInfo(
//                  "com.rstm.doctorrx", PackageManager.GET_SIGNATURES);
//          for (Signature signature : info.signatures) {
//              MessageDigest md = MessageDigest.getInstance("SHA");
//              md.update(signature.toByteArray());
//              Log.e("MY KEY HASH:",
//                      Base64.encodeToString(md.digest(), Base64.DEFAULT));
//          }
//      } catch (NameNotFoundException e) {
//
//      } catch (NoSuchAlgorithmException e) {}

    }
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.facbook_login_btn:
            socialLogin=404;
            dialog = new ProgressDialog(this);
            loadMyFriendList();
            break;
        case R.id.cross_btn:
            startActivity(new Intent(v.getContext(),MainActivity.class));
            overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
            finish();
            break;
        case R.id.login_btn:
            startActivity(new Intent(v.getContext(),LoginDetailActivity.class));
            overridePendingTransition( R.anim.slide_in_up, R.anim.slide_out_up );
            break;
        case R.id.register_btn:
            startActivity(new Intent(v.getContext(),SignupActivity.class));
            overridePendingTransition( R.anim.slide_in_up, R.anim.slide_out_up );
            break;
        case R.id.google_login_btn:
            socialLogin=401;
            initialiseGoogleclient();
            signInWithGplus();
            break;

        }
    }

    private void initialiseGoogleclient() {
        // TODO Auto-generated method stub
        mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this).addApi(Plus.API)
        .addScope(Plus.SCOPE_PLUS_LOGIN).build();
    }
    private void loadMyFriendList() {
        // TODO Auto-generated method stub
        if (Utils.haveNetworkConnection(this)) {
            dialog.setMessage("Verifying credentials...");
            dialog.show();
            FacebookService.instance().setContext(getApplicationContext());
            if (!Utils.isAuthenticated()) {

                FacebookService.instance().fetchFacebookProfile(this);
            } else {
                UserContext.authorized = true;
                startActivity(new Intent(this,MyNewMainActivity.class));
                overridePendingTransition( R.anim.slide_in_left, R.anim.slide_out_left);
                dialog.dismiss();
                finish();

            }
        }
    }
    @Override
    public void onListFetched(ArrayList<JSONObject> onLinefriends,
            ArrayList<JSONObject> idleLinefriends,
            ArrayList<JSONObject> offLinefriends) {
        // TODO Auto-generated method stub
        //dialog.dismiss();

    }
    @Override
    public void onFbError() {
        // TODO Auto-generated method stub
        dialog.dismiss();
    }
    public void onFacebookProfileRetreived(boolean isSuccess) {
        // override this method
        if (isSuccess) {

            startActivity(new Intent(this,MyNewMainActivity.class));
            overridePendingTransition( R.anim.slide_in_left, R.anim.slide_out_left);
            dialog.dismiss();
            finish();
        } else {
            Toast.makeText(this, "Some Error occurred!", Toast.LENGTH_LONG).show();
            dialog.dismiss();
        }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // super.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
        if(socialLogin==404){
        if (!UserContext.authorized) {
            FacebookService.instance().authorizeCallback(requestCode,
                    resultCode, data);
            UserContext.authorized = true;
            //dialog.dismiss();

        }
        }
        if(socialLogin==401)
        {
                if (requestCode == RC_SIGN_IN) 
                {
                    if (resultCode != RESULT_OK) {
                        mSignInClicked = false;
                    }

                    mIntentInProgress = false;

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

    }
//  public void onStart() {
//      super.onStart();
//      if (!Utils.haveNetworkConnection(this)) {
//          showNoConnectionDialog();
//      }
//  }

    private void showNoConnectionDialog() {
        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
        alt_bld.setMessage("Error in Network Connection!").setCancelable(false)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        finish();
                    }
                });
        AlertDialog alert = alt_bld.create();
        alert.setTitle("Error!");
        alert.setIcon(R.drawable.ic_launcher);
        alert.show();
    }
@Override
public void onConnectionFailed(ConnectionResult result) {
    // TODO Auto-generated method stub
    if (!result.hasResolution()) {
        GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this,
                0).show();
        return;
    }

    if (!mIntentInProgress) {
        // Store the ConnectionResult for later usage
        mConnectionResult = result;
        if (mSignInClicked) {
            // The user has already clicked 'sign-in' so we attempt to
            // resolve all
            // errors until the user is signed in, or they cancel.
            resolveSignInError();
        }
    }
}


@Override
public void onConnected(Bundle paramBundle) {
    // TODO Auto-generated method stub
    mSignInClicked = false;

    // Get user's information
    getProfileInformation();
    if(socialLogin==401){
    startActivity(new Intent(this,MyNewMainActivity.class));
    overridePendingTransition( R.anim.slide_in_left, R.anim.slide_out_left);
    finish();}
}
@Override
public void onConnectionSuspended(int paramInt) {
    // TODO Auto-generated method stub
    mGoogleApiClient.connect();
}

protected void onStart() {
    super.onStart();
    mGoogleApiClient.connect();
}

protected void onStop() {
    super.onStop();
    if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
    }
}

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

/**
 * Updating the UI, showing/hiding buttons and profile layout
 * */



/**
 * 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);


            // by default the profile url gives 50x50 px image only
            // we can replace the value with whatever dimension we want by
            // replacing sz=X
//          personPhotoUrl = personPhotoUrl.substring(0,
//                  personPhotoUrl.length() - 2);
            if(mPrefs == null){
                mPrefs = this.getSharedPreferences("MyGamePreferences", android.content.Context.MODE_PRIVATE);
            }
            SharedPreferences.Editor editor = mPrefs.edit();
            editor.putInt("login",401);
            editor.putString("Guser_name", personName);
            editor.putString("Guserpic_url", personPhotoUrl);
            editor.commit();
            UserContext.MyPicUrl=personPhotoUrl;
            UserContext.MyDisplayName=personName;
        } else {
            Toast.makeText(getApplicationContext(),
                    "Person information is null", Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

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

/**
 * Sign-out from google
 * */
public static void signOutFromGplus() {
    if (mGoogleApiClient.isConnected()) {
        Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
        mGoogleApiClient.disconnect();
        //mGoogleApiClient.connect();
    }
}
/**
 * Revoking access from google
 * */
public   void revokeGplusAccess() {
    if (mGoogleApiClient.isConnected()) {
        Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
        Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
                .setResultCallback(new ResultCallback<Status>() {
                    @Override
                    public void onResult(Status arg0) {
                        Log.e(TAG, "User access revoked!");
                        mGoogleApiClient.connect();
                    }

                });
    }
}



}

profileFragment

public class ProfileFragment extends Fragment {
    SharedPreferences mPrefs;
    Button logout_btn;
     @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
     {

         View rootView = inflater.inflate(R.layout.profile_layout, container, false);
         TextView name =(TextView)rootView.findViewById(R.id.my_name);
         ImageView myimage=(ImageView)rootView.findViewById(R.id.my_pic);
         logout_btn=(Button)rootView.findViewById(R.id.logout_btn);

         logout_btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Editor editor = mPrefs.edit();

                // for Normal Login
                 if(mPrefs.getInt("login", -404)==201)
                 {
                     editor.putString("normal_login_username", "");
                     editor.putInt("normallogin", -201);
                 }
                 // for Gmail
                 if(mPrefs.getInt("login", -404)==401)
                 {
                     LoginActivity.signOutFromGplus();
                     LoginActivity.socialLogin=-10;
                     editor.putInt("login", -401);
                 }
                 // for Facebook
                 if(mPrefs.getInt("login", -404)==404)
                 {
                     new MyAsyncTask().execute();
                     editor.putInt("login", -404);

                 }
                editor.commit();
                Intent intent = new Intent(getActivity(),LoginActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                getActivity().finish(); 

            }
        });
         if(mPrefs == null){
                mPrefs = getActivity().getSharedPreferences("MyGamePreferences", android.content.Context.MODE_PRIVATE);
            }

         if(mPrefs.getInt("login", -401)==401){
               name.setText(mPrefs.getString("Guser_name", "Dummy User"));
               Utils.loadImageFromUrl(myimage, mPrefs.getString("Guserpic_url", "nothing found"));
            }
         if(mPrefs.getInt("login", -404)==404)
         {
             name.setText(mPrefs.getString("display_name", "Dummy User"));
             Utils.loadImageFromUrl(myimage, mPrefs.getString("profile_url", "nothing found"));
            }

         if(mPrefs.getInt("login", -404)==201)
         {
             name.setText(mPrefs.getString("normal_login_username", "Dummy User"));
            }
         return rootView;
     }    


        @Override
        public void onStart() {     
            super.onStart();

        }

        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
            // TODO Auto-generated method stub
            super.onCreateOptionsMenu(menu, inflater);
            menu.clear();
            inflater.inflate(R.menu.activity_main_actions, menu);
        }
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

        }

        public class MyAsyncTask extends AsyncTask<Void, Void, Void>{

            @Override
            protected Void doInBackground(Void... params) {
                // TODO Auto-generated method stub
                 try {
                        FacebookService.instance().signout();
                    } catch (MalformedURLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                return null;
            }

        }



}

我的问题是如何从 googleplus 的另一个 fragmnet/activity 注销。 任何想法将不胜感激

最佳答案

有两种方法可以解决这个问题,

  • 使用单例类初始化 GooglePlusClient,使其在整个应用程序中全局化/在应用程序类中对其进行初始化。

  • 或者您必须在所有 Activity 中初始化 gplusclient(为此,编写一个具有所有 gplus 功能(如 sigin、signout)的抽象/基本 Activity 类,并在您想要处理 gplus 功能的所有 Activity 中扩展该基类.

另一个建议:在 Activity 而不是 fragment 中处理 GplusClient 对象(如注销/登录)。在 fragment/Activity 之间进行通信的逻辑如下

  • 在 fragment 中定义接口(interface)
  • 在 Activity 中实现该接口(interface)
  • 通过此接口(interface)进行通信(例如:如果您在 fragment 中有按钮,则在单击按钮时调用由 Activity 实现的接口(interface)函数,并在 Activity 中进行处理)。 Google site will help you (with examples)

例如(BaseActivity例子)

public class GplusBaseActivity extends Activity implements PlusClientFragment.OnSignedInListener {
    public static final int REQUEST_CODE_PLUS_CLIENT_FRAGMENT = 1550;
    public static final int REQUEST_CODE_PLUS_CLIENT_PICK = 1551;
    public static final int REQUEST_CODE_PLUS_CLIENT_API = 1552;
    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    private PlusClientFragment mGPlusSignInFragment;
    protected PlusClient mPlusClient;
    protected Context mContext;
    protected LoginHelper.GplusLoginCallback mOnGplusLoginCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        mGPlusSignInFragment =
                PlusClientFragment.getPlusClientFragment(this, MomentUtil.ACTIONS);
    }

    @Override
    public void setupActionBar(ActionBar actionBar) {

    }

    public Context getContext() {
        return this;
    }

    public Activity getActivity() {
        return this;
    }

    public void gplusLogin(LoginHelper.GplusLoginCallback gplusLoginCallback) {
        mOnGplusLoginCallback = gplusLoginCallback;
        mGPlusSignInFragment.signIn(REQUEST_CODE_PLUS_CLIENT_FRAGMENT);
    }

    @Override
    public void onSignedIn(PlusClient plusClient) {
        mPlusClient = plusClient;
        Person currentPerson = plusClient.getCurrentPerson();
        // After signin code
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_PLUS_CLIENT_FRAGMENT) {
            L.d("onActivityResult: from G+,requestCode: " + requestCode + ", resultCode:" + resultCode);
            mGPlusSignInFragment.handleOnActivityResult(requestCode, resultCode, data);
        } 
    }

    private boolean servicesConnected() {
        int resultCode = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(this);

        if (ConnectionResult.SUCCESS == resultCode) {
            //L.d("Google Play services is available.");
            return true;
        } else {

            Dialog errorDialog = GooglePlayServicesUtil.getErrorDialog(
                    resultCode, this, CONNECTION_FAILURE_RESOLUTION_REQUEST);

            if (errorDialog != null) {
                ErrorDialogFragment errorFragment = new ErrorDialogFragment();
                errorFragment.setDialog(errorDialog);
                errorFragment.show(getSupportFragmentManager(),
                        "Locations Updates");
            }
            return false;
        }
    }

    public void showSelectAccountsUI() {
        try {
            Intent intent = AccountPicker
                    .newChooseAccountIntent(null, null,
                            new String[]{"com.google"}, true, null, null,
                            null, null);
            startActivityForResult(intent,
                    REQUEST_CODE_PLUS_CLIENT_PICK);
        } catch (ActivityNotFoundException e) {
            e.printStackTrace();
            L.wrong(mContext);
            servicesConnected();
        }
    }


    private static class ErrorDialogFragment extends DialogFragment {
        private Dialog mDialog;

        public ErrorDialogFragment() {
            super();
            mDialog = null;
        }

        public void setDialog(Dialog dialog) {
            mDialog = dialog;
        }

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            return mDialog;
        }
    }

    public void gplusLogout() {
        if (mPlusClient != null) {
            L.d("Loggin out G+");
            plusSignOut(mPlusClient);
        }
    }

    private void plusSignOut(PlusClient plusClient) {
        if (plusClient.isConnected()) {
            plusClient.clearDefaultAccount();
            plusClient.disconnect();
        }
    }

    public void logout(View view) {
        gplusLogout();
    }

}

带有 fragment 的主要 Activity 示例:

假设你有一个 LogoutFragment,你想从 g+ 注销

public class LogoutFragment extends Fragment {
    LogoutFragmentListener mLogoutFragmentListener;
    public interface LogoutFragmentListener{
        public void onLogoutBtnClick();
    }

    Button mLogoutButton; // this is your sign-out btn 

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try{
            mLogoutFragmentListener=(LogoutFragmentListener)activity;
        }catch (Exception e){
            throw new IllegalStateException("Parent activity should implement LogoutFragmentListener");
        }
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mLogoutButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mLogoutFragmentListener.onLogoutBtnClick();
            }
        });
    }

    ...
    ...
}

你的主要 Activity 是

public class MainActivity extends GplusBaseActivity implements LogoutFragment.LogoutFragmentListener {

    ...
    ...

    @Override
    public void onLogoutBtnClick(){
        gplusLogout(); // method from super class
    }
}

关于android - 从 Google plus 集成中的另一项 Activity 中注销是行不通的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24523907/

相关文章:

java - 在布局之间更改大小

android - 在android中创建一个chatView布局

android - ViewPager 安卓 :NullPointerException: Attempt to invoke virtual method

java - 您如何找到当前与当前 ParseUser 关联的 ParseRoles?

Android:唤醒锁和处理方向变化

android - 如何根据调用Intent恢复同一个Activity中的内容?

android - 为什么我们必须在 android list 文件中声明 Activity 和服务?

java - Android Fragment 中的 Volley 请求队列(getApplicationContext 可能会产生 NullPointerException)

java - MapActivity 上没有显示 map

android - 我的 Android SDK 管理器中没有系统镜像