-2

我想在 facebook 上以编程方式从我的应用程序中共享文本/图像。我应该如何继续。经过大量谷歌搜索后,我发现了很多示例应用程序,但是由于不推荐使用最新的 FB SDK,这些 API 很难找到使用方法新的 SDK。请帮我解决这个问题。

 private void publishFeedDialog() {
        Bundle params = new Bundle();
         params.putString("name", "Facebook SDK for Android");
         params.putString("caption", "Build great social apps and get more    installs.");
         params.putString("description", "The Facebook SDK for Android makes it     easier and faster to develop Facebook integrated Android apps.");
    params.putString("link", "https://developers.facebook.com/android");
     params.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-     howtos/master/Images/iossdk_logo.png");

    WebDialog feedDialog = (
        new WebDialog.FeedDialogBuilder(getApplicationContext(),
            Session.getActiveSession(),
            params))
        .setOnCompleteListener(new OnCompleteListener() {

            @Override
            public void onComplete(Bundle values,
                FacebookException error) {
                if (error == null) {
                    // When the story is posted, echo the success
                    // and the post Id.
                    final String postId = values.getString("post_id");
                    if (postId != null) {
                        Toast.makeText(getApplicationContext(),
                            "Posted story, id: "+postId,
                            Toast.LENGTH_SHORT).show();
                    } else {
                        // User clicked the Cancel button
                        Toast.makeText(getApplicationContext(), 
                            "Publish cancelled", 
                            Toast.LENGTH_SHORT).show();
                    }
                } else if (error instanceof FacebookOperationCanceledException) {
                    // User clicked the "x" button
                    Toast.makeText(getApplicationContext(), 
                        "Publish cancelled", 
                        Toast.LENGTH_SHORT).show();
                } else {
                    // Generic, ex: network error
                    Toast.makeText(getApplicationContext(), 
                        "Error posting story", 
                        Toast.LENGTH_SHORT).show();
                }
            }

        })
        .build();
    feedDialog.show();
}

这是我从 fb API 3.5 doc 得到的,我已经尝试过,但它通过说 session 为 null 来使应用程序崩溃。

4

1 回答 1

0

这里你的会话是空的,因为你还没有开始它。您必须在登录后开始会话。

您可以通过使用来实现这一点

Session.openActiveSession(this, true, new Session.StatusCallback() {

  // callback when session changes state

});

有关更多信息,请尝试浏览http://developers.facebook.com/docs/android/scrumptious/authenticate/中的教程。这些真的很有帮助。

以下是我的实现方式——

此类用于对 facebook 进行初始操作

登录Facebook班级

/**
* for integrating facebook in your app..
* Firstly import FacebookSDK lib project and add in your project as lib project.
* then 
*  create an instance of this class
* and, then call the facebook login method by passing reference of your activity and   true, if you want to fetch data and, false if you want to share data on faceboko
* Please do whatever you want in the interface callback methods 
* implemented by this class
 * 
 * 
 * Note: Please write a line exactly in your activity's on activity result as
 * -- Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
 * here, 'Session' is Class of Facebook.
 * 'this' is reference of your activity

*/
 public class FacebookLoginClass implements FB_Callback
 {
  Context context;
 FBImPlmentation fbImpl;
String mImageURLString = "", mPhotoTypeString = "";
 // private FBBean userDataBean;

/**
 * constructor for FacebookLoginClass
 * @param con : context of activity
 * @param string 
 * @param mImageURLString2 
 */
public FacebookLoginClass(Context con)
{
    this.context = con;
    fbImpl = FBImPlmentation.getInstance(context, this);
}

public FacebookLoginClass(Context con, String imageURLString, String photoType) 
{
    this.context = con;
    fbImpl = FBImPlmentation.getInstance(context, this);
    mImageURLString = imageURLString;
    mPhotoTypeString = photoType;
}

/**
 * method for initiating facebook Login
 * @param isDataFetch : true for fetching user data, false for sharing on wall
 */
public void facebookLogin(boolean isDataFetch)
{
    fbImpl.CheckSession(isDataFetch);
}

/**
 * method for facebookLogout 
 */
public void facebookLogout()
{
    fbImpl.fbLogout();
}

@Override
public void onLogin(Session s)
{
    fbImpl.getDataFromFB(s);
}

@Override
public void onLoginForShareData()
{
    Log.e("facebook.", "True in..........");
    Bundle postParams = new Bundle();
    postParams.putString("name", "");
    postParams.putString("caption", "");
    postParams.putString("description", " Android, share your pics and videos");
    if (mPhotoTypeString.equalsIgnoreCase("photo")) 
    {
        postParams.putString("picture", mImageURLString);
    } 
    else 
    {
        postParams.putString("link", "");
    }
    fbImpl.publishFeedDialog(postParams);
}

@Override
public void onAuthFailiure()
{

}

@Override
public void onUserData(FBBean fbUserDataBean)
{
    try 
    {
        if (BejoelUtility.isNetworkAvailable(context)) 
        {
            String imageURLString = "http://graph.facebook.com/" + fbUserDataBean.getUserID() + "/picture?type=large";
            new FacebookTwitterLoginAsyncTask(context, fbUserDataBean.getFirstNAme(), fbUserDataBean.getLastName(),
                    fbUserDataBean.getMailId(), fbUserDataBean.getUserBday(), fbUserDataBean.getUserSex(), "", "", imageURLString,
                    fbUserDataBean.getAccessToken(), "facebook").execute();
        } 
        else 
        {
            BejoelUtility.showMsgDialog(context, context.getString(R.string.app_name), context.getString(R.string.no_internet));
        }
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}

@Override
public void onPost(boolean postStatus)
{
    // TODO Auto-generated method stub

}

@Override
public void onFriendRequest(boolean shareAppStatus)
{
    // TODO Auto-generated method stub

}

@Override
public void onLogout(boolean status)
{
    // TODO Auto-generated method stub

}

}

此类与 facebook 互动

public class FBImPlmentation
{
public static List<String> READ_PERMISSIONS = Arrays.asList("email");
public List<String> WRITE_PERMISSIONS = Arrays.asList("publish_actions");
private static FBImPlmentation fbImpl;
private FB_Callback mInterface;
private static Activity activity;
boolean isDataFetch=false;
private String mAccessTokenString = "";

/**
 * constructor for facebookImplementation
 * @param con :context of activity via FacebookLogin Class
 * @param mInterface : refrence of class implementing FB_Callback interface..as in our case,
 *  it is refrence of FacebookLogin Class
 * @return : instance of FBImplementation
 */
public static FBImPlmentation getInstance(Context con, FB_Callback mInterface)
{
    activity = (Activity) con;
    if (fbImpl == null)
        fbImpl = new FBImPlmentation();
    fbImpl.mInterface = mInterface;
    return fbImpl;
}

/**
 * method to be called for facebook Logout
 */
public void fbLogout()
{
    if (Session.getActiveSession() != null)
    {
        Session.getActiveSession().closeAndClearTokenInformation();
    }
    Session.setActiveSession(null);
    mInterface.onLogout(true);
}

/**
 * method for checking session.
 * if session is not open, then open a new session.
 * If session is already open then..just call the fbcallback onlogin method
 * @param isDataFetch2 
 */
public void CheckSession(boolean isDataFetch2)
{
    fbImpl.isDataFetch= isDataFetch2;
    Session s = Session.getActiveSession();
    if (s != null && s.isOpened())
    {
        if(isDataFetch)
            mInterface.onLogin(s);
        else
            mInterface.onLoginForShareData();
        mAccessTokenString = s.getAccessToken();
    }
    else
    {
        Session.openActiveSession(activity, true, mFBCallback);
    }
}

//  Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity, permissions);
Session.StatusCallback mFBCallback = new Session.StatusCallback()
{
    // call method is always called on session state change
    @Override
    public void call(Session session, SessionState state, Exception exception)
    {
        if (session.isOpened())
        {
            List<String> permissions = session.getPermissions();
            if (!isSubsetOf(READ_PERMISSIONS, permissions))
            {
                Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity, READ_PERMISSIONS);
                session.requestNewReadPermissions(newPermissionsRequest);
                return;
            }
            else if(isDataFetch)
            {
                mInterface.onLogin(session);
            }
            else
            {
                mInterface.onLoginForShareData();
            }

        }
    }
};

/**
 * method for fetching the user data
 * @param session : it takes the refrence of active session
 */
public void getDataFromFB(Session session)
{
    Request.executeMeRequestAsync(session, new Request.GraphUserCallback()
    {
        // callback after Graph API response with user object
        @Override
        public void onCompleted(GraphUser user, Response response)
        {
            if (user != null)
            {
                // code to retrieve user's data and pass to signup fragment
                FBBean fbUserDataBean = new FBBean();

                if (mAccessTokenString != null)
                    fbUserDataBean.setAccessToken(mAccessTokenString);
                else 
                {
                    fbUserDataBean.setAccessToken("");
                }

                if (user.getUsername() != null && !(user.getUsername().equals(null)))
                    fbUserDataBean.setUserName(user.getUsername());
                else 
                {
                    fbUserDataBean.setUserName("");
                }

                if (user.getFirstName() != null && !(user.getFirstName().equals(null)))
                    fbUserDataBean.setFirstNAme(user.getFirstName());
                else 
                {
                    fbUserDataBean.setFirstNAme("");
                }

                if (user.getLastName() != null && !(user.getLastName().equals(null)))
                    fbUserDataBean.setLastName(user.getLastName());
                else 
                {
                    fbUserDataBean.setLastName("");
                }

                if (user.getBirthday() != null && !(user.getBirthday().equals(null)))
                    fbUserDataBean.setUserBday(user.getBirthday());
                else 
                {
                    fbUserDataBean.setUserBday("");
                }

                if (user.asMap().get("gender") != null) 
                {
                    fbUserDataBean.setUserSex(user.asMap().get("gender").toString());
                }
                else 
                {
                    fbUserDataBean.setUserSex("");
                }

                if (user.getProperty("email") != null && !(user.getProperty("email").equals(null)))
                    fbUserDataBean.setMailId(user.getProperty("email").toString());
                else 
                {
                    fbUserDataBean.setMailId("");
                }

                if (user.getId() != null && !(user.getId().equals(null)))
                    fbUserDataBean.setUserID(user.getId());
                else 
                {
                    fbUserDataBean.setUserID("");
                }

//        String[] sportsArray = FacebookUtils.getSportsArray(user.getInnerJSONObject());
//                  if (sportsArray != null &&    !(sportsArray.equals(null)))
  //                        fbUserDataBean.setSportsname(sportsArray);

                mInterface.onUserData(fbUserDataBean);
             }
        }
    });
}

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

/**
 * method for publishing posts
 */
public void publishFeedDialog(Bundle postParams)
{
    Session s = Session.getActiveSession();
    List<String> permissions = s.getPermissions();
    if (!isSubsetOf(WRITE_PERMISSIONS, permissions))
    {
        Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(activity,
                WRITE_PERMISSIONS);
        s.requestNewPublishPermissions(newPermissionsRequest);
        return;
    }

 //     Bundle postParams = new Bundle();
//      postParams.putString("name", "Facebook SDK for Android");
//      postParams.putString("caption", "Build great social apps and get more    installs.");
//      postParams.putString("description", "Video by Lata manadjahgkfdjhaskjd akhgfkjashfkjash");
   //       postParams.putString("link", "");
    //        postParams.putString("picture", "");

    WebDialog feedDialog = (new WebDialog.FeedDialogBuilder(activity, Session.getActiveSession(), postParams))
            .setOnCompleteListener(new OnCompleteListener()
            {
                @Override
                public void onComplete(Bundle values, FacebookException error)
                {
                    if (error == null)
                    {
                        // When the story is posted, echo the success
                        // and the post Id.
                        final String postId = values.getString("post_id");
                        if (postId != null)
                        {
                            mInterface.onPost(true);
                        }
                        else
                        {
                            // User clicked the Cancel button
                            mInterface.onPost(false);
                        }
                    }
                    else
                        if (error instanceof FacebookOperationCanceledException)
                        {
                            // User clicked the "x" button
                            //                              Toast.makeText(MainActivity.this.getApplicationContext(), "Publish cancelled",
                            //                                      Toast.LENGTH_SHORT).show();
                            mInterface.onPost(false);
                        }
                        else
                        {
                            // Generic, ex: network error
                            //                              Toast.makeText(MainActivity.this.getApplicationContext(), "Error posting story",
                            //                                      Toast.LENGTH_SHORT).show();
                            mInterface.onAuthFailiure();
                        }
                }

            }).build();
    feedDialog.show();
}

}
于 2013-10-11T11:49:03.387 回答