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. JDBC学习2:为什么要写Class.forName("XXX")?

    Class.forName(String name) 接上一篇JDBC.本来这个内容是放在前面的一篇里面的一起的,后来发现越写越多,想想看就算了,还是单独开一篇文章好了,这样也能写得更加详细点. 上一 ...

  2. 四则运算的实现(C++)重做

    #include <iostream> using namespace std; void main() { int a0[1000],b0[1000],c0[1000],a1[1000] ...

  3. 作业二:Github注册账户过程

    Github注册账户过程如下: Github的注册及使用说明: [1]http://www.aehyok.com/Blog/Detail/73.html [2] http://www.cnblogs. ...

  4. VS2012编译的Windows服务启动后立即停止的解决方案

    ATL中的BUG,在没有COM的服务中,使用_ATL_NO_COM_SUPPORT. 并在服务中添加下面的代码 #if defined(_ATL_NO_COM_SUPPORT) HRESULT Pre ...

  5. 每天一个linux命令(54):ping命令

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”.不能打开网页时会说“你先ping网关地址192.168.1.1试试”. ...

  6. Java程序员的日常 —— 《编程思想》持有对象

    集合框架可以说是Java里面必备的知识点了,日常的使用中也会遇到各种情况需要使用到集合.下面就简单介绍下各种集合的使用场景: List List可以看做是数组,实现的方式有两种: ArrayList ...

  7. Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串

    Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串 原理::syso  向ByteArrayOutputStream这个流理想write字节..然后可以使 ...

  8. 第六节:Vue过滤器的用法和自定义过滤器

    1.过滤器的用法,用  '|' 分割表达式和过滤器. 例如:{{ msg |  filter}}     {{msg | filter(a)}}  a就标识filter的一个参数. 用两个过滤器:{{ ...

  9. 关于Thread.currentThread()和this的差异

    重新来看多线程时,被这结果搞懵逼了.不多说,直接上代码: public class MyThread02 extends Thread { public MyThread02() { System.o ...

  10. java 显示透明背景png图片

    首先理由ps生成一个背景透明的png图片,然后设置JPanel面板的透明属性,也就是panel.setOpaque(false);设置为透明 class MyPanel extends JLayere ...