2013-07-25 26 views
1

我正在研究android應用程序中的facebook集成。我做了很多關於facebook inn android的錯誤處理的搜索,但沒有任何結果。任何人都可以告訴我如何處理這些情況在Android:如何在android中處理facebook的錯誤

1.用戶更改她的密碼,使訪問令牌無效。 2.用戶取消您的應用程序授權。 3.用戶註銷Facebook。

我的facebook集成的代碼是在這裏:

private UiLifecycleHelper uiHelper; 

    private Session.StatusCallback callback = new Session.StatusCallback() { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      onSessionStateChange(session, state, exception); 
     } 
    }; 



    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     if ( exception instanceof FacebookOperationCanceledException || 
       exception instanceof FacebookAuthorizationException) 
     { 
       new AlertDialog.Builder(MainWindow.this) 
        .setTitle("cancel") 
        .setMessage("your permission has expired.") 
        .setPositiveButton("ok", null) 
        .show(); 

     } 

    } 




private void onClickFacebookRequest() 
{ 
     if (session.isOpened()) 
     { 
      sendRequests(); 

     } else { 
      StatusCallback callback = new StatusCallback() { 
       public void call(Session session, SessionState state, Exception exception) { 
        if (exception != null) { 
         new AlertDialog.Builder(MainWindow.this) 
           .setTitle(R.string.login_failed_dialog_title) 
           .setMessage(exception.getMessage()) 
           .setPositiveButton(R.string.ok_button, null) 
           .show(); 
        session = createSession(); 
        } 
       } 
      }; 
      pendingRequest = true; 


      session.openForRead(new Session.OpenRequest(this).setCallback(callback)); 
     } 
    } 
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); 
private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization"; 

private void sendRequests() 
{ 

    List<String> permissions = quytechApps.getSession().getPermissions(); 
     if (!isSubsetOf(PERMISSIONS, permissions)) { 
      pendingRequest = true; 
      Session.NewPermissionsRequest newPermissionsRequest = new Session 
        .NewPermissionsRequest(this, PERMISSIONS); 
      session.requestNewPublishPermissions(newPermissionsRequest); 
      return; 
     } 

     showValidationDialog("Please Wait.posting Data on Facebook"); 
     Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.splash_screen_final4); 

     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     image.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     byte[] byteArray = stream.toByteArray(); 

     Bundle postParams=new Bundle(); 
     postParams.putByteArray("photo",byteArray); 
     postParams.putString("message", "Hi Friends I am using Twinqli Chat App."); 

     Request request = new Request(Session.getActiveSession(), "me/photos", postParams, HttpMethod.POST, new Request.Callback() 
     { 

      @Override 
      public void onCompleted(Response response) { 
       // TODO Auto-generated method stub 
       // showPublishResult(getString(R.string.photo_post), response.getGraphObject(), response.getError()); 
      if(response.getError() == null) 
      { 
       Log.d("GraphApiSample.java Sucesses","sucess"); 
       dismissValidatingDialog(); 
      } 
      else 
      { 
       dismissValidatingDialog(); 
       session.closeAndClearTokenInformation(); 
       //quytechApps.getSession(). 
       //quytechApps.setSession(null); 
//     Log.d("GraphApiSample.java",""+response.getError().getErrorMessage()); 
      } 

      } 

     }); 
     request.executeAsync(); 
} 

private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) { 
     for (String string : subset) { 
      if (!superset.contains(string)) { 
       return false; 
      } 
     } 
     return true; 
    } 

static final String applicationId = "390611174384274"; 
boolean pendingRequest; 
static final String PENDING_REQUEST_BUNDLE_KEY = "com.facebook.samples.graphapi:PendingRequest"; 

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

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (qsession.onActivityResult(this, requestCode, resultCode, data) && 
       pendingRequest && 
       session.getState().isOpened()) { 
      sendRequests(); 
     } 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 

     pendingRequest = savedInstanceState.getBoolean(PENDING_REQUEST_BUNDLE_KEY, pendingRequest); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putBoolean(PENDING_REQUEST_BUNDLE_KEY, pendingRequest); 
    } 

誰能幫助我。提前致謝。

+0

你在用'facebook-api'嗎? –

+0

沒錯。我爲android使用了facebook-api。 –

+0

下面的答案對你有幫助嗎? –

回答

0

此問題與面部錯誤處理有關,處理起來非常複雜。

但是,當我使用面書API時,我得到了可能返回的錯誤代碼列表,因此我能夠優雅地解決這種情況。我猜你在問什麼,是優雅的錯誤處理。

首先,如果是這樣的話,谷歌的搜索顯示這url

現在關閉的有趣的部分:

訪問令牌的失效:這裏的錯誤說明是:無效的OAuth 2.0訪問令牌和返回的錯誤號碼是:190

用戶德authorirization:這是一個權限問題,所以錯誤說明是:權限錯誤,錯誤沒有爲:200

用戶登出:當用戶註銷,就會導致用戶DAT一個錯誤。錯誤描述是:用戶數據失敗和錯誤號是:310.

但是,還有其他一些場景,您需要考慮。爲此,您可以在這裏獲得這個LINK中所有這些錯誤代碼的列表。

2

Ming Li提到的handleError()方法與請求錯誤有關。它不處理登錄錯誤。我沒有在Facebook文檔中看到任何示例,也沒有看到有關如何處理登錄錯誤的示例,除了區分取消和錯誤之外。我的建議是在登錄嘗試之前產生錯誤的條件(例如更改密碼,取消應用程序授權等),然後在登錄回調中查看您爲error.getMessage()獲取的不同值,並相應地構建您自己的機制例如,如果消息中出現「會話」一詞,請告訴用戶登錄Facebook應用程序)。另請注意,getLocalizedMessage()似乎不起作用(從SDK 3.5.2開始)。您可以通過if (exception instanceof FacebookOperationCanceledException)if (exception instanceof FacebookAuthorizationException)來區分取消和錯誤,但這很重要。