【问题标题】:Signout from another activity in Google plus integration is not work从 Google plus 集成中的其他活动注销无效
【发布时间】:2014-08-22 19:38:54
【问题描述】:

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

MyNewMainActivtiy.java 包含 3 个片段,例如 SearchFragment--> NearbyFragment--> ProfileFragment

我已成功完成登录并获取个人资料信息并在 profileFragment 中设置名称和图片 当我再次点击 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 注销另一个片段/活动。 任何想法将不胜感激

【问题讨论】:

    标签: android android-activity fragment google-plus


    【解决方案1】:

    有两种方法可以处理这个问题,

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

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

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

    • 在您的片段中定义一个接口
    • 在活动中实现该接口
    • 通过该接口进行通信(例如:如果fragment中有按钮,点击按钮时,调用activity实现的接口函数,并在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();
        }
    
    }
    

    带有片段的主要活动示例:

    假设您有 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();
                }
            });
        }
    
        ...
        ...
    }
    

    你的主要活动是

    public class MainActivity extends GplusBaseActivity implements LogoutFragment.LogoutFragmentListener {
    
        ...
        ...
    
        @Override
        public void onLogoutBtnClick(){
            gplusLogout(); // method from super class
        }
    }
    

    【讨论】:

    • 除了您提供的链接之外,能否请您提供示例代码
    • 添加了一个我曾经做过的基本活动示例。 LoginActivity 可以扩展 GplusBaseActivity,并调用相应的方法。
    • 您能否解释更多如何使用单例类在应用程序应用程序中维护 googleApiClient 对象/在应用程序类中初始化它。在登录后使用 google plus 登录示例从 android hive 导航到另一个活动。我需要退出该活动 android 请帮助我
    【解决方案2】:

    我通过在我的 MyNewMainActivity.java 中实现 ConnectionCallbacks 和 OnConnectionFailedListener 接口解决了我的问题,该接口托管了我的所有片段(搜索、附近和配置文件)并从ProfileFragment 像这样

    ((MyNewMainActivity)getActivity()).signOutFromGplus();
    

    【讨论】:

      猜你喜欢
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2016-07-01
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多