Facebook android sdk中不同活动之间的会话

Facebook android sdk中不同活动之间的会话,android,facebook,session,Android,Facebook,Session,我的应用程序中有两个活动用于处理1登录2共享映像如果未登录,请先登录,然后共享 问题是,当我在一个活动中包含所有代码时,它就工作了。但是,当我将登录放入一个片段中,共享映像在另一个活动中时,则登录是有效的,但共享映像活动的行为不正确,即使已登录,也会要求我登录,并且不会触发共享映像操作 登录片段: public class Home extends Fragment { public View rootView; public ImageView HomeBg; publ

我的应用程序中有两个活动用于处理1登录2共享映像如果未登录,请先登录,然后共享

问题是,当我在一个活动中包含所有代码时,它就工作了。但是,当我将登录放入一个片段中,共享映像在另一个活动中时,则登录是有效的,但共享映像活动的行为不正确,即使已登录,也会要求我登录,并且不会触发共享映像操作

登录片段:

public class Home extends Fragment {
    public View rootView;
    public ImageView HomeBg;
    public ImageView buttonLoginLogout;
    public TextView chi;
    public TextView eng;
    public ColorStateList oldColor;
    public SharedPreferences prefs;

    //Facebook login
    private Session.StatusCallback statusCallback = new SessionStatusCallback();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        getActivity().getActionBar().hide();

        rootView = inflater.inflate(R.layout.home, container, false);
        buttonLoginLogout = (ImageView) rootView.findViewById(R.id.home_connectFB);
        eng = (TextView) rootView.findViewById(R.id.btn_eng);
        chi = (TextView) rootView.findViewById(R.id.btn_chi);

        if (getActivity().getResources().getConfiguration().locale
                .equals(Locale.TRADITIONAL_CHINESE)) {
            chi.setTextColor(getActivity().getResources().getColor(
                    android.R.color.white));
            oldColor = eng.getTextColors();
        } else {
            eng.setTextColor(getActivity().getResources().getColor(
                    android.R.color.white));
            oldColor = chi.getTextColors();

        }

        eng.setOnClickListener(setChangeLangListener("en"));
        chi.setOnClickListener(setChangeLangListener("zh"));

        //Facebook login
        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

        Session session = Session.getActiveSession();
        if (session == null) {
            if (savedInstanceState != null) {
                session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState);
            }
            if (session == null) {
                session = new Session(getActivity());
            }
            Session.setActiveSession(session);
            if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
                session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
            }
        }

        updateView();

        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();
        Session.getActiveSession().addCallback(statusCallback);
    }

    @Override
    public void onStop() {
        super.onStop();
        Session.getActiveSession().removeCallback(statusCallback);
    }

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

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Session session = Session.getActiveSession();
        Session.saveSession(session, outState);
    }

    private void updateView() {
        Session session = Session.getActiveSession();
        if (session.isOpened()) {
            buttonLoginLogout.setImageResource(R.drawable.landing_btn_take_a_selfie);
            buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) { 
                    ((LandingPage)getActivity()).tabHost.setCurrentTab(2);
                }
            });
        } else {
            buttonLoginLogout.setImageResource(R.drawable.landing_btn_connect_facebook);
            buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) { onClickLogin(); }
            });
        }
    }

    private void onClickLogin() {
        Session session = Session.getActiveSession();
        if (!session.isOpened() && !session.isClosed()) {
            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
        } else {
            Session.openActiveSession(getActivity(), this, true, statusCallback);
        }
    }


    private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            updateView();
        }
    }

    public OnClickListener setChangeLangListener(final String lang) {
        OnClickListener changeLangListener = new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Configuration config = new Configuration(getResources()
                        .getConfiguration());

                if (lang.equals("en")) {
                    config.locale = Locale.ENGLISH;
                    chi.setTextColor(oldColor);
                    eng.setTextColor(getActivity().getResources().getColor(
                            android.R.color.white));
                } else {
                    config.locale = Locale.TRADITIONAL_CHINESE;
                    eng.setTextColor(oldColor);
                    chi.setTextColor(getActivity().getResources().getColor(
                            android.R.color.white));
                }

                getResources().updateConfiguration(config,getResources().getDisplayMetrics());

                onConfigurationChanged(config);
            }
        };
        return changeLangListener;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      Intent intent = getActivity().getIntent();
      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
      getActivity().finish();
      startActivity(intent);
    }

}
图像共享活动:

public class SharePicForm extends Activity {

    private final String TAG = "SharePicForm";
    public ImageView photoArea;
    public ImageView sharePhotoBtn;
    public EditText shareContent;
    public Bitmap mBitmap;
    public Context ctx;
    public String shareTxt;

    //Facebook share
    private Session.StatusCallback statusCallback = new SessionStatusCallback();
    private PendingAction pendingAction = PendingAction.NONE;
    private enum PendingAction {
        NONE, POST_PHOTO
    }

    public static boolean isShowForm = true;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.share_pic_form);
        ctx = this;

        Utility.setHeader(this,R.string.selfie_header,false);

        photoArea = (ImageView) findViewById(R.id.photo_area);
        shareContent = (EditText) findViewById(R.id.share_content);

        Intent intent = getIntent();
        String fileUri = (String) intent.getStringExtra("photo");
        FileInputStream inputStream;

        try {
            File imgSelected = new File(fileUri);
            if (imgSelected.exists()) {
                inputStream = new FileInputStream(imgSelected);
                mBitmap = Utility.decodeBitmap(inputStream, 1280, 960);
                photoArea.setImageBitmap(mBitmap);
                sharePhotoBtn = (ImageView) findViewById(R.id.share_submit);
                sharePhotoBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (mBitmap != null && FormValidation.hasText(shareContent)) {
                            try {
                                File imageToShare = saveBitmapToStorage();
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            shareTxt = shareContent.getText().toString();

                            Session session = Session.getActiveSession();

                            if (session.isOpened()) {
                                Log.d(TAG,"logined");
                                performPublish(PendingAction.POST_PHOTO);
                            } else {
                                Log.d(TAG,"not logined");
                                onClickLogin();
                            }

                            //new FormSubmit(ctx).execute("shareImg",imageToShare, textToShare);
                        }
                    }
                });
            } else {
                Utility.showDialog(ctx,"error");
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    private File saveBitmapToStorage () throws IOException{
        String path = Environment.getExternalStorageDirectory().toString();
        File outputFile = new File(path, "temp.jpg");
        FileOutputStream out = new FileOutputStream(outputFile);
        mBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();
        return outputFile;
    }

    //Facebook share
    private void onClickLogin() {
        Session session = Session.getActiveSession();
        if (!session.isOpened() && !session.isClosed()) {
            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
        } else {
             Session.openActiveSession(this, true, statusCallback);
        }
    }


    private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if (pendingAction != PendingAction.NONE &&
                    (exception instanceof FacebookOperationCanceledException ||
                    exception instanceof FacebookAuthorizationException)) {
                    new AlertDialog.Builder(ctx)
                        .setTitle("Cancel")
                        .setMessage("No grant permission")
                        .setPositiveButton("ok", null)
                        .show();
                pendingAction = PendingAction.NONE;
            } else if (state == SessionState.OPENED_TOKEN_UPDATED) {
                handlePendingAction();
            }
            performPublish(PendingAction.POST_PHOTO);
        }
    }


    private boolean hasPublishPermission() {
        Session session = Session.getActiveSession();
        return session != null 
                && session.getPermissions().contains("publish_actions");
    }

    private void handlePendingAction() {
        PendingAction previouslyPendingAction = pendingAction;
        // These actions may re-set pendingAction if they are still pending, but we assume they will succeed.
        pendingAction = PendingAction.NONE;
        if (previouslyPendingAction == PendingAction.POST_PHOTO)
            postPhoto();
    }

    private void performPublish(PendingAction action) {
        Session session = Session.getActiveSession();
        if (session != null) {
            Log.d(TAG,"session != null");
            pendingAction = action;
            if (hasPublishPermission()) {
                Log.d(TAG,"Has permission");
                // We can do the action right away.
                handlePendingAction();
                return;
            } else if (session.isOpened()) {
                Log.d(TAG,"No permission");
                // We need to get new permissions, then complete the action when we get called back.
                session.requestNewPublishPermissions(new Session.NewPermissionsRequest(this, "publish_actions"));
                return;
            }
            Log.d(TAG,"Session not open");
        }       
        Log.d(TAG,"Session null");
    }

    private void postPhoto() {
        Log.d(TAG,"postPhoto: " + hasPublishPermission());
        if (hasPublishPermission()) {
            if (mBitmap != null) {
            Request request = Request.newUploadPhotoRequest(
                    Session.getActiveSession(),mBitmap, new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            showPublishResult(response.getError());
                        }
                    });
            Bundle params = request.getParameters();

            if (shareTxt != null) 
                params.putString("message", shareTxt);

            request.setParameters(params);
            request.executeAsync();
            }
        } else {
            pendingAction = PendingAction.POST_PHOTO;
        }
    }

    private void showPublishResult(FacebookRequestError error) {
        if (error == null) {
            Utility.showDialog(ctx,"success_photo");
        } else {
            Utility.showDialog(ctx,"error");
        }
    }

}
谢谢你的帮助。任何帮助都是非常感谢的

共享映像活动的日志

02-11 02:18:17.914: D/SharePicForm(21646): logined
02-11 02:18:17.914: D/SharePicForm(21646): session != null
02-11 02:18:17.914: D/SharePicForm(21646): No permission

您的片段中缺少“UiLifecycleHelper”实现:

现在,Session.getActiveSession不应返回null。
我希望这会有所帮助。

您的应用程序似乎运行正常,第二个登录请求是在您请求其他权限发布权限时发出的。这是预期的行为。
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
 //Do what ever you want to do here 
 }
};    

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

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    uiHelper.onPause();
}

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

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