Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法在Android上打开与Facebook的新会话后停止_Android_Facebook_Session_Facebook Graph Api - Fatal编程技术网

方法在Android上打开与Facebook的新会话后停止

方法在Android上打开与Facebook的新会话后停止,android,facebook,session,facebook-graph-api,Android,Facebook,Session,Facebook Graph Api,我正在尝试将我的android应用程序中的一张照片发布到facebook wall,它可以工作,但我需要使用post按钮两次,第一次授权用于登录,第二次授权用于授权我的应用程序 我不知道为什么在请求一个新会话后,例如session.openActiveSession(这个,true,回调),我的方法的其余部分停止运行,所以在我再次调用该方法后,它现在请求应用程序权限和post 以下是相关部分: 当我点击post按钮performPublish(PendingAction.post_PHOTO,f

我正在尝试将我的android应用程序中的一张照片发布到facebook wall,它可以工作,但我需要使用post按钮两次,第一次授权用于登录,第二次授权用于授权我的应用程序

我不知道为什么在请求一个新会话后,例如
session.openActiveSession(这个,true,回调),我的方法的其余部分停止运行,所以在我再次调用该方法后,它现在请求应用程序权限和post

以下是相关部分:

当我点击post按钮
performPublish(PendingAction.post_PHOTO,false)时调用此选项

这些是其余的,但它们与这个问题无关

   @SuppressWarnings("incomplete-switch")
    private void handlePendingAction() {
        PendingAction previouslyPendingAction = pendingAction;
        // These actions may re-set pendingAction if they are still pending, but we assume they
        // will succeed.
        pendingAction = PendingAction.NONE;

        switch (previouslyPendingAction) {
            case POST_PHOTO:
                postPhoto();
                break;
        }
    }

    private boolean hasPublishPermission() {
        Session session = Session.getActiveSession();
        return session != null && session.getPermissions().contains("publish_actions");
    }

private void postPhoto() {
     if (hasPublishPermission()) {


    //if (Session.getActiveSession().getPermissions().contains("publish_actions") && (Session.getActiveSession() != null || Session.getActiveSession().isOpened()))
            showLoading();
            Request request = Request.newUploadPhotoRequest(Session.getActiveSession(), myBm, new Request.Callback() {
                @Override
                public void onCompleted(Response response) {
                    hideLoading();
                    showPublishResult("photo_post", response.getGraphObject(), response.getError());
                    //Toast.makeText(getApplicationContext(), "Photo successfully uploaded to Facebook.", Toast.LENGTH_SHORT).show();                   
                }
            });
            Bundle parameters = request.getParameters(); 

            // photo's description
            if (moment.name != null)
                parameters.putString("message",moment.name);

            request.setParameters(parameters);
            request.executeAsync();

        }
        else {
            pendingAction = PendingAction.POST_PHOTO;
        }
}

调用openActiveSession后,方法的其余部分将停止运行,因为打开会话是异步的。因此,在调用openActiveSession之后,会话就没有打开。它启动另一个活动(LoginActivity),提示用户等,然后通过onActivityResult方法返回答案

如果您想在一次单击中处理它,您应该在状态回调中添加一些代码,并检查是否有挂起的发布,如果是,则在该点执行发布


SDK附带的HelloFacebook示例应用程序演示了如何执行此操作。

我从HelloFacebook获得了这些代码,但该应用程序仅允许您在登录后发布,然后单击发布按钮,这也是两个步骤,我如何在一个步骤中完成此操作?您没有。(策略)已经要求您分离读取和发布权限的请求,因此已经有2个请求了。建议应用程序在用户首次启动应用程序时请求读取权限,然后在实际需要时请求发布权限。通过这种方式,用户可以理解您为什么要请求这些权限,并且更有可能将这些权限授予您。那么您的意思是没有办法在一个步骤中完成登录和授权?它必须请求两次许可?我在这里有点迂腐,但我说的是你需要分开阅读和发布许可。授权有很多含义,请求读取权限也是授权的一种形式(在这种情况下,您可以在一个步骤中登录并授权)。只是您需要单独请求发布权限。此外,您只需要请求一次发布权限,在用户授予您发布权限后,您不需要再次请求。
   @SuppressWarnings("incomplete-switch")
    private void handlePendingAction() {
        PendingAction previouslyPendingAction = pendingAction;
        // These actions may re-set pendingAction if they are still pending, but we assume they
        // will succeed.
        pendingAction = PendingAction.NONE;

        switch (previouslyPendingAction) {
            case POST_PHOTO:
                postPhoto();
                break;
        }
    }

    private boolean hasPublishPermission() {
        Session session = Session.getActiveSession();
        return session != null && session.getPermissions().contains("publish_actions");
    }

private void postPhoto() {
     if (hasPublishPermission()) {


    //if (Session.getActiveSession().getPermissions().contains("publish_actions") && (Session.getActiveSession() != null || Session.getActiveSession().isOpened()))
            showLoading();
            Request request = Request.newUploadPhotoRequest(Session.getActiveSession(), myBm, new Request.Callback() {
                @Override
                public void onCompleted(Response response) {
                    hideLoading();
                    showPublishResult("photo_post", response.getGraphObject(), response.getError());
                    //Toast.makeText(getApplicationContext(), "Photo successfully uploaded to Facebook.", Toast.LENGTH_SHORT).show();                   
                }
            });
            Bundle parameters = request.getParameters(); 

            // photo's description
            if (moment.name != null)
                parameters.putString("message",moment.name);

            request.setParameters(parameters);
            request.executeAsync();

        }
        else {
            pendingAction = PendingAction.POST_PHOTO;
        }
}