2013-05-29 126 views
0

我在Android中使用Facebook SDK。我試圖創建一個應用程序,使用Facebook沒有Facebook SDK駐留在某個Activity或Fragment中。即 - 我有一個按鈕,點擊它後,我想允許分享一些圖像。Android和Facebook SDK

我得到它來打開facebook SDK,要求權限,但它卡在Session.OPENING,然後我無法請求權限,因此無法發佈。

我的代碼如下(我沒有發佈變量和幫助函數,因爲他們不添加信息)。它住在一個班裏,而不是在一個活動中。

此時我會打電話PostToFacebook一次(它會嘗試打開會話),然後我會再次調用它 - 所以它會嘗試發佈。我稍後將修復此重複。

public void postToFacebook(byte[] ImageToPost, Activity activity, Bundle savedInstanceState) { 

    Session session = Session.getActiveSession(); 

    if (session != null){ 
     SessionState state = session.getState(); 
     Log.d("facebook","in PostToFacebook. session: " + state.name()); 

     if (!state.isOpened()) { 
      Log.d("facebook","Session is not open - aborting publish"); 
      return; 
     } 

     // Check for publish permissions  
     List<String> permissions = session.getPermissions(); 
     if (!isSubsetOf(PERMISSIONS, permissions)) { 
      pendingPublishReauthorization = true; 
      Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity, PERMISSIONS); 
      session.requestNewPublishPermissions(newPermissionsRequest); 
      return; 
     } 

     Bundle postParams = new Bundle(); 
     postParams.putString("name", "Name of post"); 
     postParams.putString("caption", "Caption of post [testing]"); 
     postParams.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps."); 
     postParams.putString("link", "some link"); 
     postParams.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png"); 

     Request.Callback callback= new Request.Callback() { 
      public void onCompleted(Response response) { 
       Log.d("facebook","Callback after onCompleted"); 

       JSONObject graphResponse = response 
              .getGraphObject() 
              .getInnerJSONObject(); 
       String postId = null; 
       try { 
        postId = graphResponse.getString("id"); 
       } catch (JSONException e) { 
        Log.i(TAG, 
         "JSON error "+ e.getMessage()); 
       } 
       FacebookRequestError error = response.getError(); 
       if (error != null) { 
        Toast.makeText(MainMirrorActivity.context 
         .getApplicationContext(), 
         error.getErrorMessage(), 
         Toast.LENGTH_SHORT).show(); 
        } else { 
         Toast.makeText(MainMirrorActivity.context 
          .getApplicationContext(), 
          postId, 
          Toast.LENGTH_LONG).show(); 
       } 
      } 
     }; 

     Request request = new Request(session, "me/feed", postParams, 
           HttpMethod.POST, callback); 

     RequestAsyncTask task = new RequestAsyncTask(request); 
     task.execute(); 
    } else { 
     // open new session 
     Log.d("facebook","opening a new session"); 
     if (savedInstanceState != null) { 
      session = Session.restoreSession(activity, null, statusCallback, savedInstanceState); 
     } 
     if (session == null) { 
      session = new Session(activity); 
     } 
     Session.setActiveSession(session); 
     //SessionState state = session.getState(); 
     if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
      Log.d("facebook","openForRead"); 
      session.openForRead(new Session.OpenRequest(activity).setCallback(statusCallback)); 
     } 

     if (!session.isOpened() && !session.isClosed()) { 
      Log.d("facebook","openForRead if session not open and not closed"); 
      session.openForRead(new Session.OpenRequest(activity).setCallback(statusCallback)); 
     } else { 
      Log.d("facebook","openActiveSession"); 
      Session.openActiveSession(activity, true, statusCallback); 
     } 
    } 
} 

當我檢查狀態時,它總是卡在OPENING上。

非常感謝!

P.S - 代碼似乎幾乎工作,所以它可能會幫助某人。

+0

我沒有在你的代碼開幕看到一個回調。你能否更好地描述什麼是失敗? –

+0

當我調用SessionState state = session.getState(); - 國家將永遠是'開放' – Roman

+0

也許[這個其他問題](http://stackoverflow.com/questions/13885521/)可以幫助。 – 5agado

回答

0

我假設你發佈的代碼是初始化會話對象的第一個點。首先,我會嘗試在別的塊,當你的getActiveSession == NULL

Session session = Session.openActiveSessionFromCache(getApplicationContext()); 

代替

session = new Session(activity); 

爲你調用來獲取會話。但我不認爲這是你的主要問題。

將回調附加到會話中,以便您可以在狀態完成打開後執行操作。

你的空檢查後,我會假設的可能性,本次會議是還沒有準備好,並附加了當它準備

if(session.isOpened()){ 
      doSomething(session); 
     } else { 
      session.addCallback(new Session.StatusCallback() { 
       @Override 
       public void call(Session session, SessionState state, Exception exception) { 
        if(session.isOpened()){ 
         doSomething(session); 
        } 

       } 
      }); 
     } 
+0

謝謝,試過 - 簡直沒有幫助。我正試圖將其移植到一個片段 - 但仍然沒有成功。 – Roman