Live Connect可以让各种客户端访问Live账号、获取好友列表、访问One Drive的文件等,官方地址在此:http://msdn.microsoft.com/zh-cn/live/ff519582

贴几个有用的地址,实在是太难找了:

Live SDK下载:http://msdn.microsoft.com/zh-CN/live/ff621310

应用管理地址:https://account.live.com/developers/applications/index

Github上的代码:https://github.com/liveservices/,https://github.com/liveservices/LiveSDK

MSDN代码示例:http://code.msdn.microsoft.com/SkyDrive-Photo-API-sample-f06778ae

作用域和权限说明,感觉这个是比较重要的:http://msdn.microsoft.com/zh-cn/library/live/hh243646.aspx

在Windows Phone中使用的代码示例:http://msdn.microsoft.com/zh-cn/library/live/hh826550.aspx

一、使用前的准备

对于Windows Phone应用来说,首先需要在应用管理添加应用。URL貌似不填也没关系。需要注意的是,在API设置里一定,“移动或桌面客户端应用”一定要选择“是”,才能使用OAuth2.0验证流程。根域、重定向URL根据需要填写。我需要的只是获取用户身份,访问One Drive文件,因此没填。

二、使用方式

基本上使用有两种方式,SDK里提供了现成的登陆控件,可以直接用,如果不用这个控件的话也可以自己写登陆过程。

使用控件的方式可参考http://msdn.microsoft.com/zh-cn/library/live/hh826550.aspx的代码示例,拖一个SignInButton进来,设置好SessionChanged事件就可以了,不需要管Click事件,点击的时候控件自己会调用相应的处理程序。

如果自己写的话,可以采用这里的方式:http://lancelarsen.com/persisting-skydrive-login-on-windows-phone-8-via-livesdk/ 主要代码如下:

private static readonly string[] _scopes =
new[] {
"wl.signin",
"wl.basic" }; private LiveConnectClient _connection;
private LiveLoginResult _login; public LiveLogin()
{
this.Loaded += this.OnLoaded;
} private async void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
//----------------------------------------------------------------------
// Login to skydrive
//----------------------------------------------------------------------
await SkydriveLogin();
} private async Task SkydriveLogin()
{
try
{
//----------------------------------------------------------------------
// Initialize our auth client with the client Id for our specific application
//----------------------------------------------------------------------
LiveAuthClient authClient = new LiveAuthClient("**your client id here**"); //----------------------------------------------------------------------
// Using InitializeAsync we can check to see if we already have an connected session
//----------------------------------------------------------------------
_login = await authClient.InitializeAsync(_scopes); //----------------------------------------------------------------------
// If not connected, bring up the login screen on the device
//----------------------------------------------------------------------
if (_login.Status != LiveConnectSessionStatus.Connected)
{
_login = await authClient.LoginAsync(_scopes);
} //----------------------------------------------------------------------
// Initialize our connection client with our login result
//----------------------------------------------------------------------
_connection = new LiveConnectClient(_login.Session);
}
catch (Exception ex)
{
//TODO: Add connection specific exception handling
}
}

注意一下作用域与权限,一般来说wl.signin wl.basic这两个是必须的,我在第一次用的时候发现即使用户登录了,下次打开应用还需要再次点击授权一次,很麻烦,后来发现必须要加上wl.offline_access这个作用域,下次登陆就默认是登陆状态了。

三、参考文章

http://social.msdn.microsoft.com/Forums/live/en-US/6df1f31d-a22c-469c-b9f4-5c79e0882701/persisting-session-on-windows-phone?forum=messengerconnect

http://igrali.com/2012/12/11/live-connect-sdk-for-windows-phone-8authenticating-and-basic-info/

http://stackoverflow.com/questions/10946629/wp7-how-to-store-liveconnectsession-during-tombstoning

http://stackoverflow.com/questions/13212120/windows-phone-live-sdk-api-get-new-session-object-after-restarting-the-app

四、实践

我的目的是,用户可以不必登陆即可浏览,但如果要发布评论的话必须登陆Live账号,用户登录一次后,下次打开应用应该就可以直接获取用户信息而不必再次登陆了。

首先在App.xaml.cs里添加一个静态变量,用来保存当前Live连接,也可以直接保存获取到的用户信息

/// <summary>
/// live client
/// </summary>
public static LiveConnectClient CurrentLiveConnectClient { get; set; }

在程序运行时先看看当前的连接状态,如果已经登陆过了,则设置当前的Live连接,否则就什么也不用做了,等需要用户登录操作的时候再提示:

try
{
string[] _scopes = new string[] { "wl.signin", "wl.basic", "wl.offline_access", "wl.skydrive", "wl.skydrive_update" };
LiveAuthClient authClient = new LiveAuthClient("your client id");
LiveLoginResult _login = await authClient.InitializeAsync(_scopes);
#region 如果要强制用户为登陆状态则使用以下代码
//if (_login.Status != LiveConnectSessionStatus.Connected)
//{
// _login = await authClient.LoginAsync(_scopes);
//}
//App.CurrentLiveConnectClient = new LiveConnectClient(_login.Session);
#endregion
if(_login.Status == LiveConnectSessionStatus.Connected)
{
//如果为登陆状态 则设置LiveConnectClient供以后调用 否则就等到需要用户登录的时候再提示登陆
App.CurrentLiveConnectClient = new LiveConnectClient(_login.Session);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}

然后在需要用户登录操作的地方,放上一个登陆按钮,设置SessionChanged事件

        private async void btnSignin_SessionChanged(object sender, LiveConnectSessionChangedEventArgs e)
{
if (e.Status == LiveConnectSessionStatus.Connected)
{
if (App.CurrentLiveConnectClient == null)
{
App.CurrentLiveConnectClient = new LiveConnectClient(e.Session);
}
LiveOperationResult operationResult = await App.CurrentLiveConnectClient.GetAsync("me");
try
{
dynamic meResult = operationResult.Result;
if (meResult.first_name != null &&
meResult.last_name != null)
{
infoTextBlock.Text = "Hello " +
meResult.first_name + " " +
meResult.last_name + "!";
}
else
{
infoTextBlock.Text = "Hello, signed-in user!";
}
}
catch (LiveConnectException exception)
{
this.infoTextBlock.Text = "Error calling API: " +
exception.Message;
}
}
else
{
infoTextBlock.Text = "Not signed in.";
}
}

我这里保存的是LiveConnectClient,貌似直接保存用户信息更方便一些,随便了。等写完这个文章再改。

还可以在VM里设置评论框和登陆区域的显示方式,比如绑定到某个属性上,如果登陆了则显示评论框,没登陆显示登陆按钮。

在Windows Phone 8中使用Live Connect并保持登陆状态的更多相关文章

  1. ASP.NET 在 Windows Azure 环境中使用基于 SQLServer 的 Session

    Session 嘛,占一点儿服务器资源,但是总归比 ViewState 和 Cookie 安全点儿,所以还是要用的. Windows Azure 环境中的 Web 服务器经由负载均衡调度,根本无法保证 ...

  2. windows和linux中搭建python集成开发环境IDE——如何设置多个python环境

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  3. 【转】windows和linux中搭建python集成开发环境IDE

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  4. Windows 商店应用中使用 SharePoint REST API

    前面一篇我们介绍了 Office 365 REST API 的官方工具的使用,本篇我们来看一下 SharePoint REST API 本身的描述.结构和使用方法,以及一些使用经验. 首先来看看Sha ...

  5. Windows 商店应用中使用 Office 365 API Tools

    本篇我们介绍一个API 工具,用于在 Windows Store App 中使用 Office 365 API. 首先来说一下本文的背景: 使用 SharePoint 做过开发的同学们应该都知道,Sh ...

  6. 【转】深入Windows内核——C++中的消息机制

    上节讲了消息的相关概念,本文将进一步聊聊C++中的消息机制. 从简单例子探析核心原理 在讲之前,我们先看一个简单例子:创建一个窗口和两个按钮,用来控制窗口的背景颜色.其效果 图1.效果图  Win32 ...

  7. 将自己写的windows服务加入到windows集群中

    最近发现windows集群能进行很多自定义,比如在集群中加入自己编写的服务. 能自定义的可不少,截个图: 本次演示中,只想用“通用服务”这个类型. 先列下步骤 编写一个记录时间的Windows服务,这 ...

  8. Windows 2012 R2中安装SharePoint 2013 sp1参考

    之前介绍过在window 2012中安装SharePoint 2013,这次,借着SharePoint 2013 sp1补丁发布之际,介绍下在window 2012 r2中安装SharePoint 2 ...

  9. 在Windows Server 2012 中安装 .NET 3.5 Framework

    问题 如今,仍然有许多程序和应用需要依靠.NET 3.5 framework 来运行.在Windows Server 2012中,微软提供了.NET 3.5 和.NET 4.5的安装选项以为你的应用程 ...

随机推荐

  1. 使用ACE遇到无法打开包括文件:“inttypes.h”的解决方案

    本来想使用ACE_Get_Opt类来做一个命令行解析的功能,但是当项目中配置好了ACE库的路径后,编译时遇到"无法打开包括文件: inttypes.h : No such file or d ...

  2. Twain头文件

    #ifndef TWAIN#define TWAIN /************************************************************************ ...

  3. 关于JavaScript内存泄漏的质疑

    近几天看了些关于JavaScript内存管理的文章,相对于Java JVM的内存管理,显得简单些. 在学习的过程中,发现有不少网友谈到了循环引用,说循环引用会造成内存泄漏,垃圾回收器无法回收. 实际上 ...

  4. ActiveMQ第六弹:设置多个并行的消费者

    消息队列本来就是一种经典的生产者与消费者模式.生产者向消息队列中发送消息,消费者从消息队列中获取消息来消费. 消息的传送一般由一个代理来实现的,那就是Message broker(即消息代理).Mes ...

  5. 跟我一起云计算(4)——lucene

    了解lucene的基本概念 这一部分可以参考我以前写的博客: http://www.cnblogs.com/skyme/tag/lucene/ lucene是什么 下图是一个很好的说明: 1.luce ...

  6. Windows 10 周年版尝鲜

    早在今年的 Build 大会上,微软就开始宣传最新的 Windows 10 周年版更新,炫了不少特技,直到昨天(2016/8/2 PST)才正式放出,相关新闻可以参考这里,正式的版本为 Version ...

  7. 趣味C程序-HelloWord

    说明:刚才写了一个基础的helloWord程序(很早以前从其他地方收集的.),本以为群里面的人是可以答对了,但是我错了,没有人.他们的错误往往被程序的外表给蒙蔽了. 很多人的回答是0.如果你仔细看的话 ...

  8. 什么是P3O?

    P3O(Portfolio, Programme and Project Offices)项目组合.项目群和项目办公室资格认证. 是由英国商务部 OGC 于2008年10月28日发布的最新的最佳实践指 ...

  9. EF架构~有时使用SQL更方便

    回到目录 在进行统计时,尤其是按月进行统计,由于我们采用的时间是一个2015-12-12日这种,所以在linq你无法进行拆分,你拆分了在发到SQL时也会报错,因为SQL那边更新不需要你.net的方法, ...

  10. Java程序员的日常 —— 多进程开发

    最近再弄进程管理相关的工作,因此必要的就涉及到各种系统下关于进程的管理. 这里简单的介绍下: 如何在Java中执行命令 在windows下肯定是dos命令了,而在linux则为shell命令.执行的方 ...