2014-01-22 5 views
0

Попытка доступа Facebook сессии на других экранах так Пробовал Session.getActiveSession, но она возвращается нуль, так пытались использовать кэш следующимОшибка при получении facebook сеанса

if (session == null) { 
    // try to restore from cache 
    session = Session 
       .openActiveSessionFromCache(getApplicationContext()); 
} 

if (session != null && session.isOpened()) { 
    // Start a background task which handles ntwork calls 
    new FetchTask().execute(); 
} 

но и получать следующее сообщение об ошибке, предложить мне подходящее решение, Благодаря здесь трассировки стека

01-21 20:28:03.431: E/AndroidRuntime(28191): FATAL EXCEPTION: main 
01-21 20:28:03.431: E/AndroidRuntime(28191): java.lang.NullPointerException: Argument '148885915321893' cannot be null 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.facebook.internal.Validate.notNull(Validate.java:29) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.facebook.Session.<init>(Session.java:227) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.facebook.Session.<init>(Session.java:216) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.facebook.Session$Builder.build(Session.java:1576) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.facebook.Session.openActiveSession(Session.java:888) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.facebook.Session.openActiveSessionFromCache(Session.java:808) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.srikanth.ema.Transaction$HttpAsyncTask.onPostExecute(Transaction.java:172) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.srikanth.ema.Transaction$HttpAsyncTask.onPostExecute(Transaction.java:1) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at android.os.AsyncTask.finish(AsyncTask.java:631) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at android.os.Looper.loop(Looper.java:137) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at android.app.ActivityThread.main(ActivityThread.java:4960) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at java.lang.reflect.Method.invokeNative(Native Method) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at java.lang.reflect.Method.invoke(Method.java:511) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
01-21 20:28:03.431: E/AndroidRuntime(28191): at dalvik.system.NativeStart.main(Native Method) 
+0

Вы пробовали мое решение? – serge

ответ

0

Вы можете создать метод, как это

private Session createSession() { 
    Session activeSession = Session.getActiveSession(); 
    if (activeSession == null || activeSession.getState().isClosed()) { 
     activeSession = new Session.Builder(mainActivity).setApplicationId(appId).build(); 
     Session.setActiveSession(activeSession); 
    } 
    return activeSession; 
} 

Тогда в конструкторе:

this.session = createSession(); 

, а затем прочитать материал

public void obtainFBInfo(){ 
    if (this.session.isOpened()) { 
     getID(); 
    } else { 
     StatusCallback callback = new StatusCallback() { 
      public void call(Session session, SessionState state, Exception exception) { 
       if (exception != null) { 
        ConnectToFacebook.this.session = createSession(); 
       } 
       else if(state == SessionState.OPENED || state == SessionState.OPENED_TOKEN_UPDATED) 
        getID(); 
      } 
     }; 
     this.session.openForRead(new Session.OpenRequest(mainActivity).setCallback(callback)); 
    } 
} 

Убедитесь, что в вашей деятельности у вас есть это:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(Session.getActiveSession() != null){ 
     Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
    } 
} 

Вот весь класс :

import android.app.Activity; 
import android.os.Bundle; 

import com.facebook.FacebookRequestError; 
import com.facebook.LoggingBehavior; 
import com.facebook.Request; 
import com.facebook.Response; 
import com.facebook.Session; 
import com.facebook.Session.StatusCallback; 
import com.facebook.SessionState; 
import com.facebook.Settings; 
import com.facebook.model.GraphObject; 

public class ConnectToFacebook { 

static final String appId = "your app ID"; 
private Session session; 
private Activity mainActivity; 

/** 
* 
*/ 
public ConnectToFacebook(Activity mainActivity) { 
    this.mainActivity = mainActivity; 
    this.session = createSession(); 
    Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 
} 

public void obtainFBInfo(){ 
    if (this.session.isOpened()) { 
     getID(); 
    } else { 
     StatusCallback callback = new StatusCallback() { 
      public void call(Session session, SessionState state, Exception exception) { 
       if (exception != null) { 

        ConnectToFacebook.this.session = createSession(); 
       } 
       else if(state == SessionState.OPENED || state == SessionState.OPENED_TOKEN_UPDATED) 
        getID(); 
      } 
     }; 
     this.session.openForRead(new Session.OpenRequest(mainActivity).setCallback(callback)); 
    } 
} 

private void getID() { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      String requestIdsText = "me"; 
      Bundle params = new Bundle(); 
      params.putString("fields", "id,name,installed"); 
      new Request(session, requestIdsText, params, null, new Request.Callback() { 
       public void onCompleted(Response response) { 
        GraphObject graphObject = response.getGraphObject(); 
        FacebookRequestError error = response.getError(); 
        if (graphObject != null) { 
         if (graphObject.getProperty("id") != null) 
          //setFbId(String.format("%s", graphObject.getProperty("id"))); 
         if (graphObject.getProperty("name") != null) 
          //setFbName(String.format("%s", graphObject.getProperty("name"))); 
         if(mainActivity instanceof ScreenOptions) 
          ((ScreenOptions) mainActivity).runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            ((ScreenOptions) mainActivity).updateConnectionStatus(); 
           } 
          }); 

        } else if (error != null) { 
         System.err.println(String.format("Error: %s", error.getErrorMessage())); 
        } 
       } 
      }).executeAndWait(); 
     } 
    }).start(); 

} 

private Session createSession() { 
    Session activeSession = Session.getActiveSession(); 
    if (activeSession == null || activeSession.getState().isClosed()) { 
     activeSession = new Session.Builder(mainActivity).setApplicationId(appId).build(); 
     Session.setActiveSession(activeSession); 
    } 
    return activeSession; 
} 
} 
+0

activeSession = новый Session.Builder (mainActivity) .setApplicationId (appId) .build(); Здесь я просматриваю сеанс в другом экране после входа в систему, поэтому я заменил mainactivity на текущую активность? –

+0

Да, но тогда вам нужно поставить часть onActivityResult, о которой я упоминал в этом действии – serge

+0

MainActivity не может быть разрешен переменной, не могли бы вы проверить синтаксис –

0

Используйте это он работает для меня

if (fb_session != null && fb_session.isOpened()) { 
    makeMeRequest(fb_session); // if facebook session open get user information  
    Log.i("Facebook Login State == >", "Facebook Login State");  
} else { 
    if (fb_session == null) { 
    fb_session = new Session(mCurrContext);    
     } 
    Session.setActiveSession(fb_session); 
    ConnectToFacebook(); // other wise connected to facebook 
    Log.i("Facebook not Login State == >", "Facebook Not login State"); 
}   

} получать исключение

01-22 04:15:34.934: E/AndroidRuntime(24283): FATAL EXCEPTION: main 
01-22 04:15:34.934: E/AndroidRuntime(24283): java.lang.NullPointerException: Argument '148885915321893' cannot be null 
01-22 04:15:34.934: E/AndroidRuntime(24283): at com.facebook.internal.Validate.notNull(Validate.java:29) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at com.facebook.Session.<init>(Session.java:227) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at com.facebook.Session.<init>(Session.java:212) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at com.srikanth.ema.Transaction$HttpAsyncTask.onPostExecute(Transaction.java:182) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at com.srikanth.ema.Transaction$HttpAsyncTask.onPostExecute(Transaction.java:1) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at android.os.AsyncTask.finish(AsyncTask.java:631) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at android.os.Looper.loop(Looper.java:137) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at android.app.ActivityThread.main(ActivityThread.java:4960) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at java.lang.reflect.Method.invokeNative(Native Method) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at java.lang.reflect.Method.invoke(Method.java:511) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
01-22 04:15:34.934: E/AndroidRuntime(24283): at dalvik.system.NativeStart.main(Native Method) 
Смежные вопросы