简体   繁体   English

当使用android-facebook api时,如何忽略设备上安装的Facebook android应用程序?

[英]How to ignore Facebook android application installed on the device, when using android-facebook api?

I have a facebook login option in my android application. 我的android应用程序中有一个facebook登录选项。

When there is no Facebook application installed on my device, this login works fine. 如果我的设备上没有安装Facebook应用程序,则此登录正常。 But when the facebook application is installed, it creates problems in a few cases. 但是当安装facebook应用程序时,它会在少数情况下产生问题。

So, how can I tell my application's facebook login to ignore if Facebook app is installed and proceed in the previous way (assuming facebook application is not installed)? 那么,如果安装了Facebook应用程序并以前一种方式继续(假设未安装facebook应用程序),我如何告诉应用程序的facebook登录信息?

This is the activity called when i click the fbLoginButton: 这是我点击fbLoginButton时调用的活动:

public class Example extends Activity {

    public static final String APP_ID = myAppIdHere;


    private LoginButton mLoginButton;
    private TextView mText;
    private Button mRequestButton;
    private Button mPostButton;
    private Button mDeleteButton;
    private Button mUploadButton;
    public static Activity ExampleActivity;

    private Facebook mFacebook;
    private AsyncFacebookRunner mAsyncRunner;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ExampleActivity = this;
        if (APP_ID == null) {
            Util.showAlert(this, "Warning", "Facebook Applicaton ID must be " +
                    "specified before running this example: see Example.java");
        }

       setContentView(R.layout.facebook);
        mLoginButton = (LoginButton) findViewById(R.id.login);
        mFacebook = new Facebook(APP_ID);
        mAsyncRunner = new AsyncFacebookRunner(mFacebook);

        SessionStore.restore(mFacebook, this);
        SessionEvents.addAuthListener(new SampleAuthListener());
        SessionEvents.addLogoutListener(new SampleLogoutListener());
        mLoginButton.init(this, mFacebook);

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

        mFacebook.authorizeCallback(requestCode, resultCode, data);
    }

    public class SampleAuthListener implements AuthListener {

        public void onAuthSucceed() {

        }

        public void onAuthFail(String error) {

        }
    }

    public class SampleLogoutListener implements LogoutListener {
        public void onLogoutBegin() {

        }

        public void onLogoutFinish() {

    }
}

This is LoginButton Class: 这是LoginButton类:

public class LoginButton extends ImageButton {

    public static Facebook mFb;
    public static String facebookID;
    public static String firstName;
    public static String lastName;
    public static String email = "";
    public static String sex;
    private Handler mHandler;
    private SessionListener mSessionListener = new SessionListener();
    private String[] mPermissions = new String[] { "read_stream", "email" };
    private Activity mActivity;

    public LoginButton(Context context) {
        super(context);
    }

    public LoginButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LoginButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void init(final Activity activity, final Facebook fb) {
        init(activity, fb, new String[] {});
    }

    public void init(final Activity activity, final Facebook fb,
            final String[] permissions) {
        mActivity = activity;
        mFb = fb;
        mPermissions = new String[] { "read_stream", "email" };
        ;
        mHandler = new Handler();

        setBackgroundColor(Color.TRANSPARENT);
        setAdjustViewBounds(true);

        if(mFb.isSessionValid()){
            getUser();
            SessionEvents.onLogoutBegin();
            AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(mFb);
            asyncRunner.logout(getContext(), new LogoutRequestListener());
        }else{

            setImageResource(R.drawable.login_button);
            drawableStateChanged();
        }

        SessionEvents.addAuthListener(mSessionListener);
        SessionEvents.addLogoutListener(mSessionListener);
        setOnClickListener(new ButtonOnClickListener());
    }

    private final class ButtonOnClickListener implements OnClickListener {

        public void onClick(View arg0) {
            if (mFb.isSessionValid()) {
                getUser();
                SessionEvents.onLogoutBegin();
                AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(mFb);
                asyncRunner.logout(getContext(), new LogoutRequestListener());
            } else {
                mFb.authorize(mActivity, mPermissions,
                        new LoginDialogListener());
            }
        }
    }

    private final class LoginDialogListener implements DialogListener {
        public void onComplete(Bundle values) {

            SessionEvents.onLoginSuccess();
        }

        public void onFacebookError(FacebookError error) {

            SessionEvents.onLoginError(error.getMessage());
        }

        public void onError(DialogError error) {

            SessionEvents.onLoginError(error.getMessage());
        }

        public void onCancel() {

            SessionEvents.onLoginError("Action Canceled");
        }

    }

    private class LogoutRequestListener extends BaseRequestListener {
        public void onComplete(String response, final Object state) {

            mHandler.post(new Runnable() {
                public void run() {

                SessionEvents.onLogoutFinish();
                }
            });
        }
    }

    private class SessionListener implements AuthListener, LogoutListener {

        public void onAuthSucceed() {

            setImageResource(R.drawable.logout_button);
            SessionStore.save(mFb, getContext());
        }

        public void onAuthFail(String error) {
        }

        public void onLogoutBegin() {
        }

        public void onLogoutFinish() {

            SessionStore.clear(getContext());
            setImageResource(R.drawable.login_button);
        }
    }

    public static void getUser() {

        try {
            JSONObject json = Util.parseJson(mFb.request("me"));
            facebookID = json.getString("id");
            firstName = json.getString("first_name");
            lastName = json.getString("last_name");
            email = json.getString("email");
            sex = json.getString("gender");
            String mFirstName = firstName;
            String mLastName = lastName;
            String mEmail = email;
            String mSex = sex;
            Log.d("User Details", "You are logged in : " + facebookID
                    + mFirstName + "." + mLastName + "  Email is: " + mEmail
                    + "-" + mSex);

            SharedPreferences.Editor editor = SignUpActivity.settings.edit();

            // Set "hasLoggedIn" to true
            editor.putBoolean("hasLoggedIn", true);
            editor.putString("fbEmail", email);
            editor.putString("fbId", facebookID);
            editor.putString("fbSex", sex);
            editor.putString("fbFirstname", firstName);
            editor.putString("fbLastname", lastName);

            // Commit the edits!
            editor.commit();
        } catch (Exception e) {
            // TODO: handle exception
            Log.d("Exception in getUser", "+++++" + e.toString());
        }
    }
}

This is SessionEvents Class: 这是SessionEvents类:

public class SessionEvents {

    private static LinkedList<AuthListener> mAuthListeners = new LinkedList<AuthListener>();
    private static LinkedList<LogoutListener> mLogoutListeners = new LinkedList<LogoutListener>();

    public static void addAuthListener(AuthListener listener) {

        mAuthListeners.add(listener);
    }

    public static void removeAuthListener(AuthListener listener) {

        mAuthListeners.remove(listener);
    }

    public static void addLogoutListener(LogoutListener listener) {

        mLogoutListeners.add(listener);
    }

    public static void removeLogoutListener(LogoutListener listener) {

        mLogoutListeners.remove(listener);
    }

    public static void onLoginSuccess() {

        LoginButton.getUser();
        for (AuthListener listener : mAuthListeners) {
            listener.onAuthSucceed();
        }
    }

    public static void onLoginError(String error) {

        for (AuthListener listener : mAuthListeners) {
            listener.onAuthFail(error);
        }
    }

    public static void onLogoutBegin() {

        for (LogoutListener l : mLogoutListeners) {
            l.onLogoutBegin();
        }
    }

    public static void onLogoutFinish() {

        for (LogoutListener l : mLogoutListeners) {
            l.onLogoutFinish();
        }
    }

    public static interface AuthListener {

        public void onAuthSucceed();

        public void onAuthFail(String error);
    }

    public static interface LogoutListener {

        public void onLogoutBegin();

        public void onLogoutFinish();
    }

}

This is SessionStore class: 这是SessionStore类:

public class SessionStore extends Activity{

    private static final String TOKEN = "access_token";
    private static final String EXPIRES = "expires_in";
    private static final String KEY = "facebook-session";

    public static boolean save(Facebook session, Context context) {

        Context contextObj = Example.ExampleActivity;
        Intent i=new Intent(contextObj , SignUpActivity.class);
        contextObj.startActivity(i);

        Editor editor =
            context.getSharedPreferences(KEY, Context.MODE_PRIVATE).edit();
        editor.putString(TOKEN, session.getAccessToken());
        editor.putLong(EXPIRES, session.getAccessExpires());
        return editor.commit();
    }

    public static boolean restore(Facebook session, Context context) {

        SharedPreferences savedSession =
            context.getSharedPreferences(KEY, Context.MODE_PRIVATE);
        session.setAccessToken(savedSession.getString(TOKEN, null));
        session.setAccessExpires(savedSession.getLong(EXPIRES, 0));
        return session.isSessionValid();
    }

    public static void clear(Context context) {

        Editor editor = 
            context.getSharedPreferences(KEY, Context.MODE_PRIVATE).edit();
        editor.clear();
        editor.commit();
    }

}

This is BaseRequestListener class: 这是BaseRequestListener类:

public abstract class BaseRequestListener implements RequestListener {

    public void onFacebookError(FacebookError e, final Object state) {
        Log.e("Facebook", e.getMessage());
        e.printStackTrace();
    }

    public void onFileNotFoundException(FileNotFoundException e,
            final Object state) {
        Log.e("Facebook", e.getMessage());
        e.printStackTrace();
    }

    public void onIOException(IOException e, final Object state) {
        Log.e("Facebook", e.getMessage());
        e.printStackTrace();
    }

    public void onMalformedURLException(MalformedURLException e,
            final Object state) {
        Log.e("Facebook", e.getMessage());
        e.printStackTrace();
    }
}

Please update below code of your Login Button Click listener. 请更新以下登录按钮的代码点击监听器。

mFb.authorize(mActivity, mPermissions, Facebook.FORCE_DIALOG_AUTH,
            new LoginDialogListener());

instead of 代替

mFb.authorize(mActivity, mPermissions, new LoginDialogListener());

And see below link for more information 有关更多信息,请参阅以下链接

Facebook Login Issue Facebook登录问题

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM