Facebook graph api 如何使用FacebookSDK for.NET创建FacebookFitness:course对象

Facebook graph api 如何使用FacebookSDK for.NET创建FacebookFitness:course对象,facebook-graph-api,facebook-c#-sdk,Facebook Graph Api,Facebook C# Sdk,我正在用C#为WindowsPhone8编写一个自行车应用程序,使用MVVMLight。我已使用最新版本(6.6.0)的FacebookSDK for.Net成功地将我的应用程序链接到Facebook,并发布了一个健身:自行车常用操作,使用以下代码: private async void ExecuteShareButtonClicked() { // Retrieve the Facebook session from Isolated Storage... var sessi

我正在用C#为WindowsPhone8编写一个自行车应用程序,使用MVVMLight。我已使用最新版本(6.6.0)的FacebookSDK for.Net成功地将我的应用程序链接到Facebook,并发布了一个健身:自行车常用操作,使用以下代码:

private async void ExecuteShareButtonClicked()
{
    // Retrieve the Facebook session from Isolated Storage...
    var session = SessionStorage.Load();
    if (session == null)
        return;

    // Fire up the ProgressIndicator...
    ProgressIndicatorText = Resources.AppResources.FacebookUpdatingStatus;
    IsProgressIndicatorVisible = true;


    // Upload the course object to Facebook...
    string courseId = await CreateCourse(session);

    // Create the parameters for the fitness.bikes action
    if (courseId != string.Empty)
    {
        var bikesParams = new Dictionary<string, object>();

        bikesParams.Add("course", courseId);
        bikesParams.Add("fb:explicitly_shared", true);
        bikesParams.Add("start_time", RideModel.RideStartTime.ToString("o"));
        bikesParams.Add("end_time", RideModel.RideFinishTime.ToString("o"));
        if (MessageText != string.Empty)
            bikesParams.Add("message", MessageText);               

        var fbClient = new FacebookClient(session.AccessToken);

        // Upload to FB
        try
        {
            string postId = string.Empty;

            dynamic fbResult = await fbClient.PostTaskAsync("/me/fitness.bikes", bikesParams);
            var result = (IDictionary<string, object>)fbResult;      

        }
        catch (Exception ex)
        {
            messageBoxService.Show(Resources.AppResources.FacebookErrorPostingStatus + ex.Message, Resources.AppResources.FacebookError);
        }
    }

    // Clear the ProgressIndicator
    ProgressIndicatorText = string.Empty;
    IsProgressIndicatorVisible = false;

    // Go back to the ride summary page...
    navigationService.GoBack();
}


private async Task<string> CreateCourse(FacebookSession session)
{
    string returnId = string.Empty;

    if (session != null)
    {
        var fbClient = new FacebookClient(session.AccessToken);

        // Convert the ride length from metres (as stored by the app) to kilometres or miles, depending upon the
        // value of MapUnits. MapUnits is an enum property which tells the programmer what units 
        // the user wants displaying. 

        var distValue = UnitConversion.ConvertDistance(RideModel.RideLength, MapUnits);
        string unitText = "m";

        switch (MapUnits) // MapUnits is an enum which tells the program if the user
        {
            case Measurement.Metric:
                unitText = "km";
                break;
            case Measurement.Imperial:
                unitText = "mi";
                break;
            default:
                break;
        }

        var courseParams = new Dictionary<string, object>();

        courseParams.Add("fb:appId", App.FacebookAppId);
        courseParams.Add("og:title", RideModel.RideName);
        courseParams.Add("og:image", "http://marknotgeorge.co.uk/ApplicationIcon.png");
        courseParams.Add("fitness:distance:value", distValue);
        courseParams.Add("fitness:distance:units", unitText);
        courseParams.Add("fitness:duration:value", RideModel.RideTime.TotalSeconds);
        courseParams.Add("fitness:duration:units", "s");

        var objectParams = new Dictionary<string, object>();
        objectParams.Add("object", courseParams);

        try
        {
            dynamic fbResult = await fbClient.PostTaskAsync("/me/objects/fitness.course", objectParams);
            var result = (IDictionary<string, object>)fbResult;

            returnId = (string)result["id"];
        }
        catch (Exception ex)
        {
            messageBoxService.Show(Resources.AppResources.FacebookErrorPostingStatus + ex.Message, Resources.AppResources.FacebookError);
        }

    }

    return returnId;
}
private async void ExecuteShareButtonClicked()
{
//从独立存储中检索Facebook会话。。。
var session=SessionStorage.Load();
if(会话==null)
返回;
//启动进程指示器。。。
ProgressIndicatorText=Resources.AppResources.FaceBookUpdatengStatus;
IsProgressIndicatorVisible=真;
//将课程对象上载到Facebook。。。
string courseId=await CreateCourse(会话);
//为fitness.bikes操作创建参数
if(courseId!=string.Empty)
{
var bikesParams=新字典();
添加(“课程”,课程ID);
添加(“fb:显式共享”,true);
添加(“开始时间”,RideModel.ridestart.ToString(“o”);
添加(“结束时间”,RideModel.RideFinishTime.ToString(“o”);
if(MessageText!=string.Empty)
添加(“消息”,MessageText);
var fbClient=newfacebookclient(session.AccessToken);
//上传到FB
尝试
{
string postId=string.Empty;
DynamicFBResult=等待fbClient.PostTaskAsync(/me/fitness.bikes),bikesParams);
var result=(IDictionary)fbResult;
}
捕获(例外情况除外)
{
messageBoxService.Show(Resources.AppResources.facebook错误发布状态+例如Message、Resources.AppResources.facebook错误);
}
}
//清除进度指示器
ProgressIndicatorText=string.Empty;
IsProgressIndicatorVisible=假;
//返回骑乘摘要页面。。。
navigationService.GoBack();
}
专用异步任务CreateCourse(FacebookSession会话)
{
string returnId=string.Empty;
if(会话!=null)
{
var fbClient=newfacebookclient(session.AccessToken);
//将骑乘长度从米(由应用程序存储)转换为公里或英里,具体取决于
//MapUnits的值。MapUnits是一个枚举属性,它告诉程序员什么是单位
//用户需要显示。
var distValue=UnitConversion.ConvertDistance(RideModel.rideleLength,MapUnits);
字符串unitText=“m”;
开关(MapUnits)//MapUnits是一个枚举,它告诉程序用户
{
外壳测量。公制:
unitText=“km”;
打破
案例测量。帝国:
unitText=“mi”;
打破
违约:
打破
}
var courseParams=新字典();
courseParams.Add(“fb:appId”,App.FacebookAppId);
添加(“og:title”,RideModel.RideName);
添加(“og:image”http://marknotgeorge.co.uk/ApplicationIcon.png");
课程地图。添加(“适合度:距离:值”,距离值);
课程地图。添加(“适合度:距离:单位”,单位文本);
添加(“适合度:持续时间:值”,RideModel.RideTime.TotalSeconds);
课程计划。添加(“适合度:持续时间:单位”,“s”);
var objectParams=new Dictionary();
objectParams.Add(“对象”,课程地图);
尝试
{
dynamic fbResult=await fbClient.PostTaskAsync(“/me/objects/fitness.course”,objectParams);
var result=(IDictionary)fbResult;
returnId=(字符串)结果[“id”];
}
捕获(例外情况除外)
{
messageBoxService.Show(Resources.AppResources.facebook错误发布状态+例如Message、Resources.AppResources.facebook错误);
}
}
返回ID;
}
现在,我想添加一些高级内容,例如拆分时间和使用ActivityDataPoints的路线图。下面是我添加到CreateCourse以添加拆分的代码:

if (ShareSplits) // If the user has specified to upload split times, this is true.
{
    courseParams.Add("fitness:splits:unit", unitText);
    var splitParams = new List<Dictionary<string, object>>();
    foreach (var item in RideModel.IntervalPoints)
    {
        // Interval times are stored every unit (kilometre or mile depending on user settings), 
        // plus a final one at the end of the ride. If the ride length is less than a unit, 
        // we only have one split to send, giving an inaccurate result. 
        if (item.Interval >= 1)
        {
            var param = new Dictionary<string, object>();
            param.Add("fitness:splits:values:value", item.IntervalTime.TotalSeconds);
            param.Add("fitness:splits:values:units", "s");
            splitParams.Add(param);
        }
    }
    courseParams.Add("fitness:splits", splitParams);
}
if(sharespits)//如果用户指定上载拆分时间,则为true。
{
添加(“适合度:分割:单位”,单位文本);
var splitParams=新列表();
foreach(RideModel.IntervalPoints中的变量项)
{
//间隔时间每单位存储一次(公里或英里,取决于用户设置),
//加上骑乘结束时的最后一个。如果骑乘长度小于一个单位,
//我们只发送一个拆分,结果不准确。
如果(item.Interval>=1)
{
var param=新字典();
参数添加(“适合度:分割:值:值”,item.IntervalTime.TotalSeconds);
参数添加(“适合度:分割:值:单位”,“s”);
splitParams.Add(参数);
}
}
课程地图。添加(“适合度:拆分”,拆分参数);
}
如您所见,我使用了一个列表来存储分割值。不幸的是,此操作失败,出现以下异常:

if (ShareSplits)
{
    Dictionary<string, object>[] splitParams;

    courseParams.Add("fitness:splits:unit", unitText);

    if (RideModel.IntervalPoints.Count > 1)
    {
        splitParams = new Dictionary<string, object>[(RideModel.IntervalPoints.Count - 1)];
        for (int i = 0; i < (RideModel.IntervalPoints.Count - 1); i++)
        {
            var param = new Dictionary<string, object>();
            param.Add("fitness:splits:values:value", RideModel.IntervalPoints[i].IntervalTime.TotalSeconds);
            param.Add("fitness:splits:values:units", "s");
            splitParams[i] = param;
        }
        courseParams.Add("fitness:splits", splitParams);
    }
}
(#100)混合显式-隐式数组语法:URL“”处类型为“fitness.course”的对象无效,因为类型为“fitness_splits”的属性“fitness:splits”是使用混合隐式数组语法的两个显式索引指定的。一次只能使用一个

那么如何发送健身:分割和活动数据点?我是否使用数组而不是列表

编辑: 我将if(ShareSplits)代码块更改为以下内容,这导致了相同的异常:

if (ShareSplits)
{
    Dictionary<string, object>[] splitParams;

    courseParams.Add("fitness:splits:unit", unitText);

    if (RideModel.IntervalPoints.Count > 1)
    {
        splitParams = new Dictionary<string, object>[(RideModel.IntervalPoints.Count - 1)];
        for (int i = 0; i < (RideModel.IntervalPoints.Count - 1); i++)
        {
            var param = new Dictionary<string, object>();
            param.Add("fitness:splits:values:value", RideModel.IntervalPoints[i].IntervalTime.TotalSeconds);
            param.Add("fitness:splits:values:units", "s");
            splitParams[i] = param;
        }
        courseParams.Add("fitness:splits", splitParams);
    }
}
if(共享拆分)
{
字典[]拆分参数;
添加(“适合度:分割:单位”,单位文本);
如果(RideModel.IntervalPoints.Count>1)
{
splitParams=newdictionary[(RideModel.IntervalPoints.Count-1)];
对于(int i=0;i<(RideModel.IntervalPoints.Count-1);i++)
{
var param=新字典();
param.Add(“适合度:拆分:值:值”),RideModel.Inter