Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Facebook登录适用于HTC Desire,但不适用于三星Galaxy S3_Java_Android_Facebook_Facebook Android Sdk - Fatal编程技术网

Java Facebook登录适用于HTC Desire,但不适用于三星Galaxy S3

Java Facebook登录适用于HTC Desire,但不适用于三星Galaxy S3,java,android,facebook,facebook-android-sdk,Java,Android,Facebook,Facebook Android Sdk,我正在开发一个连接到Facebook的Android应用程序 这是我的代码: public class FBLoginActivity extends Activity { /** * Log's tag. */ private static final String TAG = "FBLoginActivity"; /** * Widget to let user selects if he/she accepts conditions o

我正在开发一个连接到Facebook的Android应用程序

这是我的代码:

public class FBLoginActivity extends Activity
{
    /**
     * Log's tag.
     */
    private static final String TAG = "FBLoginActivity";
    /**
     * Widget to let user selects if he/she accepts conditions or not.
     */
    private ToggleButton mTglBtnAcceptConditions;
    /**
     * Represents the button to Login into Facebook.
     */
    private ImageButton mFBLoginButton;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fblogin);

        getWidgetsReferences();
    }

    @Override
    protected void onResume()
    {
        Log.v(TAG, "onResume");
        super.onResume();

        Session session = Session.getActiveSession();
        if ((session != null) && (session.isOpened()))
        {
            // Disable Facebook login button because user is logged.
            mFBLoginButton.setEnabled(false);
            // Show a message to the user saying that is logged.
            Toast.makeText(this, 
                    getString(R.string.toast_message_your_are_logged_fb),
                    Toast.LENGTH_LONG).show();
        }
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        Log.v(TAG, "onActivityResult");
        super.onActivityResult(requestCode, resultCode, data);

        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }

    /**
     * This method handles when user does click on Facebook's Login button.
     * @param view
     */
    public void onFBLoginClick(View view)
    {
        openActiveSession(this, true, statusCallback);
    }

    /**
     * Status CallBack for Facebook Open Session.
     */
    Session.StatusCallback statusCallback = new Session.StatusCallback() 
    {
        @Override
        public void call(final Session session, SessionState state, Exception exception) 
        {
            Log.v(TAG, "call");
            if(session.isOpened())
            {
                Log.v(TAG, "isOpened");
                // Show a dialog saying that we are storing user data into the
                // phone.
                final ProgressDialog savingDialog = new ProgressDialog(FBLoginActivity.this);
                savingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                savingDialog.setMessage(getString(R.string.dialog_message_saving_your_fb_data));
                savingDialog.setCancelable(false);
                savingDialog.show();

                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() 
                {
                    @Override
                    public void onCompleted(GraphUser user, Response response) 
                    {
                        Log.v(TAG, "onCompleted");
                        if(user != null)
                        {
                            // Get Facebook's ID, name, gender, birthday and email.
                            String facebookId = user.getId();
                            String name = user.getName();
                            String gender = user.getProperty("gender").toString();
                            String birthday = user.getBirthday();
                            String email = user.getProperty("email").toString();

                            // Save facebook data on Shared Preferences
                            saveUserData(facebookId, name, gender, birthday, email);

                            // Save Facebook access token on Shared preferences.
                            saveAccessToken(session.getAccessToken());

                            // Close saving user's data dialog.
                            savingDialog.dismiss();

                            // Get and save Facebook Profile Picture on internal
                            // storage.
                            GetFacebookProfilePicture task = 
                                    new GetFacebookProfilePicture(FBLoginActivity.this);
                            task.execute(user.getId());
                        }
                    }
                });
            }
        }
    };

    /**
     * Open a Facebook's session to get user personal data. On the OpenRequest 
     * we set "user_birthday" and "email" permissions. 
     * 
     * @param activity
     * @param allowLoginUI
     * @param statusCallback

     * @return Session opened with desired permissions.
     */
    private static Session openActiveSession(Activity activity,
            boolean allowLoginUI, Session.StatusCallback statusCallback)
    {
        OpenRequest openRequest = new OpenRequest(activity);
        openRequest.setPermissions(Arrays.asList("user_birthday", "email"));
        openRequest.setCallback(statusCallback);

        Session session = new Session.Builder(activity).build();

        if(SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI)
        {
            Session.setActiveSession(session);
            session.openForRead(openRequest);

            return session;
        }

        return null;
    }
}
这段代码适用于Android emulator和我以前的HTC Desire。但当我在最新的设备上测试它时,比如三星Galaxy S3,它就不起作用了

在调试代码时,我在这里添加了一个断点:
if(session.isOpened())
session对象是:

{Session state:OPENING, token:{AccessToken token:ACCESS_TOKEN_REMOVED permissions:[]}, appId:XXXXXXXXXXX}
发生了什么事?我认为问题在于代码在速度最快的设备上不起作用


你知道我在这里做什么的另一种方法吗?

我认为你不是通过提供应用程序id来创建会话。试试这个

Session session = SessionClass.createSession(getApplicationContext());
OpenRequest openRequest = new OpenRequest(activity);
        openRequest.setPermissions(Arrays.asList("user_birthday", "email"));
        openRequest.setCallback(statusCallback);
        session.openForRead(openRequest);

public static Session createSession(Context context) {
    Session activeSession = Session.getActiveSession();
    if (activeSession == null || activeSession.getState().isClosed()) {
        activeSession = new Session.Builder(context).setApplicationId("255105497966505").build();
        Session.setActiveSession(activeSession);
    }
    return activeSession;
}

我要回答我自己的问题:

这里的问题不是我在哪里测试我的应用程序。问题是,在SamsumgGalaxyS3上,测试人员使用自己的facebook帐户进行测试,而我没有停用沙盒

我犯了另一个错误:在Facebook开发者的门户上,我没有添加发布令牌


简而言之,检查是否在facebook开发者门户网站上停用了
沙盒
,以及是否添加了调试和发布令牌。

感谢您的回答,但奇怪的是,相同的代码在Android Emulator和HTC Desire上都能工作,而且它在三星Galaxy S3上不起作用。您的三星Galaxy S3中是否安装了本机facebook应用程序?是的。本机应用程序安装在三星Galaxy S3上。您是否尝试过我的Fblogin解决方案,它也在三星Galaxy S3上工作。对不起,我这里没有该设备。您可以尝试在您的设备上检查我的代码。
Also Try UiLifeCycleHelper class.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);

        this.uiHelper = new UiLifecycleHelper(this, callback);
        this.uiHelper.onCreate(savedInstanceState);
}

    @Override
    public void onResume() {
        super.onResume();
        // For scenarios where the main activity is launched and user
        // session is not null, the session state change notification
        // may not be triggered. Trigger it if it's open/closed.
        Session session = Session.getActiveSession();
        if (session != null && (session.isOpened() || session.isClosed()) ) {
            onSessionStateChange(session, session.getState(), null);
        }
        uiHelper.onResume();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
        Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }