0

我已经下载了 Facebook API 示例并进行了测试。

FacebookMobile.login(handleLogin, stage, extendedPermissions, new StageWebView());

但是,此代码似乎不起作用,它不会打开新的 Facebook 登录页面。

这是完整的源代码,我在 Adob​​e Air 3.0 下运行

package  {

    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.display.Stage;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.media.StageWebView;

    import com.facebook.graph.FacebookMobile;
    import com.facebook.graph.controls.Distractor;

    import demo.controls.GraphicButton;
    import demo.events.FacebookDemoEvent;
    import demo.models.FriendModel;
    import demo.views.FriendDetail;
    import demo.views.FriendsList;
    import demo.views.UserInfo;

    public class FriendListMobile extends MovieClip {

        //Place your application id here.
        protected static const APP_ID:String = 'xxxxxxxx';
        //Place your specified site URL for your app here. This is needed for clearing cookies when logging out.
        protected static const SITE_URL:String = 'xxxxxxxx';
        //Extended permission to access other parts of the user's profile that may be private, or if your application needs to publish content to Facebook on a user's behalf.
        protected var extendedPermissions:Array = ["publish_stream","user_website","user_status","user_about_me"];

        public var userInfo:UserInfo;
        public var loginBtn:GraphicButton;
        public var friendDetail:FriendDetail;
        public var friendList:FriendsList;

        public var distractor:Distractor;
        public var bg:DistractorOverlay;
        public var friendsModel:FriendModel;

        protected var selectedUserInfo:Object = {};

        public function FriendListMobile() {
            // constructor code
            addEventListener(Event.ADDED_TO_STAGE, handleAddedToStage);
        }

        protected function handleAddedToStage(event:Event):void {
            removeEventListener(Event.ADDED_TO_STAGE, handleAddedToStage);
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            init();
        }

        protected function init():void {
            configUI();
            addEventListeners();

            FacebookMobile.init(APP_ID, onHandleInit, null);
        }

        protected function configUI():void {
            loginBtn.label = 'Login';
            loginBtn.setSize(440, 60);
            loginBtn.setStyle('font', '_sans');
            loginBtn.setStyle('size', 25);

            friendsModel = new FriendModel();

            distractor = new Distractor();
            friendDetail.visible = false;

            bg = new DistractorOverlay();
            bg.visible = true;
            addChild(bg);

            distractor.x = 120
            distractor.y = 310; 

            bg.addChild(distractor);
        }

        protected function addEventListeners():void {
            loginBtn.addEventListener(MouseEvent.MOUSE_DOWN, handleLoginClick, false, 0, true);
            friendDetail.addEventListener(Event.CLOSE, onCloseDialog, false, 0, true);
            friendsModel.addEventListener(Event.COMPLETE, onFriendsComplete, false, 0, true);
            friendList.addEventListener(FacebookDemoEvent.FRIEND_SELECTED, onFriendSelected, false, 0, true);
        }

        /**
         * Pops up detail view for a selected friend.
         **/
        protected function showFriendDetail():void {
            bg.visible = true;

            friendDetail.visible = true;
            friendDetail.data = selectedUserInfo;

            this.setChildIndex(friendDetail, this.numChildren - 1);
        }

        /**
         * Event Handler Close DetailView
         **/
        protected function onCloseDialog(event:Event):void {
            friendDetail.visible = false;
            bg.visible = false;
        }

        /**
         * Event Handler user selects from the friend list.
         **/
        protected function onFriendSelected(event:FacebookDemoEvent):void {
            selectedUserInfo = event.data;
            showFriendDetail();
        }

        /**
         * Event Handler User clicks Login button.
         **/
        protected function handleLoginClick(event:MouseEvent):void {
            bg.visible = true;

            loginUser();
        }

        /**
         * Event Handler User clicks on Logout button.
         **/
        protected function handleLogOutClick(event:MouseEvent):void {
            FacebookMobile.logout(handleLogout, SITE_URL);

            loginBtn.label = 'Login';
            loginBtn.addEventListener(MouseEvent.MOUSE_DOWN, handleLoginClick, false, 0, true);

            friendList.clear();
            userInfo.clear();

            bg.visible = true;
        }

        /**
         * Event Handler once logged out.
         **/
        protected function handleLogout(response:Object):void {
            bg.visible = false;
        }

        /**
         * Event Handler FacebookMobile initializes application.
         * Application will check if user is return to application, 
         * if not user is prompted to log in.
         **/
        protected function onHandleInit(response:Object, fail:Object):void {
            if (response) {
                updateView(response.uid, response);
            } else {
                loginUser();
            }
        }

        /**
         * Updates UI for views 
         **/
        protected function updateView(id:String, data):void {
            userInfo.id = id;
            userInfo.data = data;

            loginBtn.label = 'Log Out';
            loginBtn.addEventListener(MouseEvent.MOUSE_DOWN, handleLogOutClick);
            loginBtn.removeEventListener(MouseEvent.MOUSE_DOWN, handleLoginClick);

            friendsModel.load();
        }

        /**
         * Preforms a login call to application. Mobile application takes in an instance 
         * StageView class.
         **/
        protected function loginUser():void {
            trace('not log in');
            FacebookMobile.login(handleLogin, stage, extendedPermissions, new StageWebView());
        }

        /**
         * Event Handler once user logs in.
         **/
        protected function handleLogin(response:Object, fail:Object):void {
            bg.visible = false;
            FacebookMobile.api('/me', handleUserInfo);
        }

        /**
         * Event Handler for users information.
         **/
        protected function handleUserInfo(response:Object, fail:Object):void {
            if (response) {
                updateView(response.id, response);
            }
        }

        /**
         * Event Handler FriendModel information has been loaded.
         **/
        protected function onFriendsComplete(event:Event):void {
            bg.visible = false;
            friendList.dataProvider = friendsModel.dataProvider;
        }
    }

}

是不是因为它只能在移动设备下工作,而不能在桌面上测试?

4

2 回答 2

2

在开发登录到 Facebook 的 Flex Mobile 应用程序时,对我有用的是将以下参数设置为 StageWebView,然后再将其传递给登录函数:

对于 Flex:

StageWebView webView = new StageWebView();
webView.stage = FlexGlobals.topLevelApplication.stage;
webView.viewPort = new Rectangle(0, 0, FlexGlobals.topLevelApplication.stage.stageWidth, FlexGlobals.topLevelApplication.stage.stageHeight);

我还没有在非 Flex air 移动应用程序上测试过这段代码,但你可以试试这个:

StageWebView webView = new StageWebView();
webView.stage = stage;
webView.viewPort = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);

并将其传递给登录函数:

FacebookMobile.login(handleLogin, stage, extendedPermissions, webView);
于 2012-05-03T02:32:45.727 回答
0

找到解决方案

而不是创建新的 StageWebView();

执行以下方式有效!是的

FacebookMobile.login(handleLogin, stage, extendedPermissions, getWebView());

私有函数 getWebView():StageWebView { if(webView) webView.dispose();

        webView = new StageWebView();
        webView.stage=this.stage;
        webView.assignFocus();

        webView.viewPort = new Rectangle(8, 8, stage.stageWidth -16, stage.stageHeight -16 );
        return webView;
    }
于 2012-05-03T02:23:18.543 回答