Передача информации о сеансе между действиями (сообщение Facebook на стене образец)

#android

#Android

Вопрос:

Я пытаюсь написать простое 2-экранное приложение, в котором на 1-м экране пользователь проходит аутентификацию на Facebook, а на 2-м экране на стене пользователя нажимается простая кнопка.

Я получаю исключение NullPointerException, когда нажимаю на кнопку PostonWall, и я считаю, что это связано с передачей информации о сеансе между действиями. Но я не могу понять, как восстановить информацию о сеансе.

Что я здесь делаю не так? Любое предложение высоко ценится!

Заранее спасибо.

Вот мой код для 1-го экрана.

 public class HelloWorldActivity extends Activity {
    /** Called when the activity is first created. */
    private static final String FACEBOOK_APPID = "XXXXXX";
    private static final String FACEBOOK_PERMISSION = "publish_stream";
    public FacebookConnector facebookConnector;
    private TextView FacebookStatus;
    private Button FacebookButton, ButtonNextScreen;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FacebookStatus=(TextView)findViewById(R.id.textView1);
        FacebookButton=(Button)findViewById(R.id.button1);
        ButtonNextScreen=(Button)findViewById(R.id.ButtonNextScreen);

        this.facebookConnector = new FacebookConnector(FACEBOOK_APPID, this, getApplicationContext(), new String[] {FACEBOOK_PERMISSION});

        FacebookButton.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                SessionEvents.AuthListener listener = new SessionEvents.AuthListener() {

                    @Override
                    public void onAuthSucceed() {
                        SessionStore.save(facebookConnector.getFacebook(), getApplicationContext());
                        FacebookStatus.setText("Facebook Authenticated!!");
                    }

                    @Override
                    public void onAuthFail(String error) {

                    }
                };
                SessionEvents.addAuthListener(listener);
                facebookConnector.login();              
            }
        });

        ButtonNextScreen.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // Intend to go second screen (SendScreen)
                Intent i=new Intent(v.getContext(),SecondClass.class);
                startActivity(i);               
            }
        });


    }
}
  

//////////////// Метод FacebookConnector,

 public FacebookConnector(String appId,Activity activity,Context context,String[] permissions) {
        this.facebook = new Facebook(appId);

        SessionStore.restore(facebook, context);
        SessionEvents.addAuthListener(mSessionListener);
        SessionEvents.addLogoutListener(mSessionListener);

        this.context=context;
        this.permissions=permissions;
        this.mHandler = new Handler();
        this.activity=activity;
    }
  

/////////////// Сохранение сеанса и методы сеанса

 public class SessionStore {

    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) {
        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();
    }
  

////////// Наконец, второй класс

открытый класс SecondClass расширяет активность {

 private static final String TAG = "FacebookSample";
private static final String MSG = "Message from FacebookSample";
private Button FacebookPostButton;
private FacebookConnector facebookConnector; // I THINK THIS SHOULD BE THE ISSUE
private final Handler mFacebookHandler = new Handler();

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

        FacebookPostButton=(Button)findViewById(R.id.FacebookPostButton);               
        FacebookPostButton.setOnClickListener(new OnClickListener() {               
        public void onClick(View v) {                   
        if (SessionStore.restore(facebookConnector.getFacebook(), getApplicationContext()))                         
                {
                    postMessageInThread();
                }                   
            }
        });
  

}

Ответ №1:

Попробуйте сохранить токен доступа a a SharedPreferences.

Что-то вроде этого :

                     SharedPreferences.Editor editor = mPrefs.edit();
                editor.putString("access_token", facebook.getAccessToken());
  

а затем получите ее в других действиях