1

我正在研究 android 应用程序中的 facebook 集成。我做了很多关于 facebook inn android 的错误处理的搜索,但没有发现任何问题。谁能告诉我如何在 android 中处理这些情况:

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

谁能帮我 。提前致谢。

4

3 回答 3

2

Ming Li 提到的handleError()方法与请求错误有关。它不处理登录错误。除了区分取消和错误之外,我还没有在 Facebook 文档中看到任何关于如何处理登录错误的示例或示例。我的建议是在登录尝试之前生成错误条件(例如更改密码、取消对应用程序的授权等),然后在登录回调中查看您为 error.getMessage() 获得的不同值,并相应地构建您自己的机制(例如,如果消息中出现“会话”一词,则告诉用户登录 Facebook 应用程序)。另请注意,getLocalizedMessage() 似乎不起作用(从 SDK 3.5.2 开始)。if (exception instanceof FacebookOperationCanceledException)您可以通过and来区分取消和错误if (exception instanceof FacebookAuthorizationException),但仅此而已。

于 2013-10-11T08:56:45.610 回答
0

这个问题与facebook错误处理有关,处理起来非常复杂。

但是,当我使用 Facebook API 时,我得到了一个可能返回的错误代码列表,因此我能够优雅地解决这种情况。我猜你要的是优雅的错误处理。

首先,如果是这样,在 google 中搜索会显示此url

现在开始有趣的部分:

访问令牌无效:这里的错误描述是:无效的 OAuth 2.0 访问令牌,返回的错误号是:190

用户取消授权:这是一个权限问题,所以错误描述是:权限错误和错误编号是:200

用户登出:当用户登出时,会导致用户数据错误。错误描述为:用户数据失败,错误编号为:310。

但是,您还需要考虑其他情况。为此,您可以在此链接中获取所有这些错误代码的列表。

于 2013-07-25T10:15:48.340 回答
0

错误处理文档在这里 - https://developers.facebook.com/docs/reference/api/errors/

您还应该查看 Scrumptious 示例应用程序,特别是 SelectionFragment.java 中的 handleError() 方法,它分解了您应该处理的不同情况。

于 2013-07-25T23:56:01.700 回答