posts - 7,  comments - 6,  trackbacks - 0
公告
  2012年6月3日

上一篇我们搭建好了SkyDrive APIs调用的环境。详细地址:SkyDrive APIs——用户登录和APP授权(2)

本篇主要实现文件和文件夹的读取和操作。

在上一篇中我们完成APP实现用户的登录和完成相关Scope(权限)的授权。当经过了这两步骤的必须操作之后, 我们就可以实现对这“云端网盘”的远端操纵了。

 

首先,来看看LiveConnectClient类的成员:

                     

上图是这个类的全部成员了。 下面对其分部讲解

第①:Session字段,构造函数需要这个字段来完成对LiveConnectClient类的实例构造。这个Session对象如何来呢?  在上一篇中的SessionChanged事件中,如果

e.Status == LiveConnectSessionStatus.Connected 那么我们就可以拿这个事件参数来完成实例构造了:LiveConnectClient liveClient = new LiveConnectClient(e.Session);

第②:回调事件。

第③:这是这个类的所有公开的操作方法。 单从字面上其实就很一目了然了,覆盖了获取、下载、上传、更新、删除、移动、赋值。不得不说微软已经把事情封装到这份上了,还有什么好说的,直接拿去用吧,连基础的HTTP请求都免了。结合②中注册回调事件,调用方法,可以搞定收工了。你会写吗——So easy!

 

不过, 等等。 注意到有个地方没有讲到。那就是参数部分。 上图的所有方法都带有string类型的path,那么,这个参数到底该传什么内容进去呢?

这里就要用到REST的相关概念了。

定义和概念我就不说了,也表达不出什么好的概念,直接上维基百科找:http://zh.wikipedia.org/wiki/REST

 

一句话的理解说:就是使用HTTP协议,请求REST的路径,然后解析返回来的json对象,转换成对象实体或集合,然后进行数据绑定,整个过程就是这样了。

来段代码:

Var liveClient = new LiveConnectClient(e.Session);	//实例化对象
                    liveClient.GetCompleted += new EventHandler<LiveOperationCompletedEventArgs>(liveClient_GetCompleted);  //注册回调事件
                liveClient.GetAsync("/me");	//调用异步方法,请求用户基本资料

        void liveClient_GetCompleted(object sender, LiveOperationCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                JsonManager.Default.ResolveFolder(e.RawResult); //处理json
                foreach (var key in e.Result.Keys)
                {
                    var result = e.Result[key];
                }

                string first_name = string.Empty;
                string last_name = string.Empty;
                if (e.Result.ContainsKey("first_name"))
                {
                    first_name = (string)e.Result["first_name"];
                }
                if (e.Result.ContainsKey("last_name"))
                {
                    last_name = (string)e.Result["last_name"];
                }
                infoText.Text = string.Format("Welcome, {0} {1}", first_name, last_name);
            }
            else
            {
                infoText.Text = "Get a error for call apis." + e.Error.Message;
            }
        }

  

这里有全部详细的REST请求路径和返回的JSON字符串 请参考:http://msdn.microsoft.com/en-us/library/live/hh243648.aspx#top

 

如果要获取用户基本信息,需要用户授予的权限scope是”wl.basic”;需要请求的REST路径是”/me”,即可。

如果要获取用户全部相册目录,需要用户授予的权限scope是"wl.signin","wl.basic","wl.photos"

”;需要请求的REST路径是” /me/albums”这些都可以对号入座的。

 

所有的理论概念,讲到这里其实都差不多了。 我在这里只是抛砖引玉,因为很多东西都只是隔着一纸纱糊,捅破了其实很简单,只是因为繁琐碎。希望能对你有帮助。

下篇开始,我将会使用MVVM模式一步步打造SkyDrive For Windows Phone APP.敬请关注。

 

posted @ 2012-06-03 18:19 黑择明 阅读(647) 评论(0) 编辑
  2012年5月25日

上一篇我们搭建好了SkyDrive APIs调用的环境。详细地址:SkyDrive  APIs——搭建环境(1)

这一篇展示一个调用示例。

在工具箱中找到SignInButton控件,并拖放至界面。(如果你的工具箱中没有SignInButton控件,请参考我的前一篇),XAML代码如下(略去以精简):

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <!--<Button Content="log in" HorizontalAlignment="Left" VerticalAlignment="Top" Click="Button_Click" />
            <Button x:Name="btnLiveGet" Content="Get" HorizontalAlignment="Left" VerticalAlignment="Top" Click="btnLiveGet_Click" Margin="0,96,0,0" />-->
            <my:SignInButton Height="72" HorizontalAlignment="Left" Margin="42,60,0,0" x:Name="btnSignIn" VerticalAlignment="Top" Width="160"
                             Branding="Windows" ClientId="Your Client ID here" TextType="Login" Scopes="wl.signin wl.basic" SessionChanged="btnSignIn_SessionChanged" />
            <TextBlock x:Name="infoText" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="{StaticResource PhoneFontSizeLarge}" />
        </Grid>

  

关键属性:

1. ClientId属性。这个属性是你在Live Connect Developer Center申请并创建的APP实例的ClientId(格式如:00000000603E0BFE),你需要这个KEY才能启动APIs,否则会报异常。

 

2. Scopes属性。 完全的documents请参考:http://msdn.microsoft.com/en-us/library/live/hh243646.aspx

说明:其实就是对于用户的授权权限。 终端用户要通过你的APP进行登录和一系列的操作,那么他肯定有权知道你的APP会使用到他的哪些权限。这个就像是从marketplace中下载一个APP时,会提示软件会使用那些capabilities一样。这个配置文件位于WMAppManifest.xml文件中。   从上一篇文章中我们看到了SkyDrive只是LIVE CONNECT APIs中的一部分,那么就需要skydrive这一部分的权限。  打个比方:就好像酒店房间, 你要想进入哪个房间,你首先得去申请到进入那个房间的房卡,然后才能进去,那么这个房卡就对应了一个scope,这样说应该很明白了吧。

Scopes="wl.signin wl.basic"多个scope使用空格“ ”分开即可。   不过微软建议从用户体验来说,别滥用scope, 你只需你的APP必须要用到的scopes即可。

 

3. Branding属性。 这个属性只是用于显示登录按钮的图标样式。有几个可选值:

Windows:  Skydrive:

Messenger:  Hotmail:

 

4. SessionChanged事件。

private void btnSignIn_SessionChanged(object sender, Microsoft.Live.Controls.LiveConnectSessionChangedEventArgs e)
        {
            if (e.Status == LiveConnectSessionStatus.Connected)
            {
                liveClient = new LiveConnectClient(e.Session);
                infoText.Text = "Signed in.";
                liveClient.GetCompleted += new EventHandler<LiveOperationCompletedEventArgs>(liveClient_GetCompleted);
                liveClient.GetAsync("me");
            }
            else
            {
                infoText.Text = "Not signed in.";
                liveClient = null;
            }
        }

说明:设个断点调试你会发现,当一进入到这个DEMO页面后SessionChanged就被触发了。我们可以根据e.Status状态来判断是否登录成功。

通过单击来进入到授权登录页面

这个时候会要求用户输入live 账号进行登录。 当输入完用户名和密码后,点击登录并验证通过后,就进入到了授权界面:

单击底下的“是”按钮后,即用户同意授权后。 SessionChanged再次被触发,我们看下e.Status的状态变成了Connected,到此,用户登录,并授权完成。 接下来你就可以在用户授权的范围下做你想做的事情了——酒店房间已开,你想怎么方便请便。

 

至此, 本篇已完成,是不是觉得其实很简单。下篇将会讲述如何进行SkyDrive文件(夹)的操作。

 转载请说明出处:http://www.cnblogs.com/mehale/archive/2012/05/25/2517941.html

 

posted @ 2012-05-25 14:11 黑择明 阅读(272) 评论(0) 编辑

 

引读:

相信不少人应该使用过微软官方出的SkyDrive网盘 APP,它能够轻松访问你的 SkyDrive 中的所有内容,包括他人与你共享的文件;对个人SkyDrive网盘的存储空间里的文件实

现增删查改管理等等,其实你也可以做到。

这一系列的文章我会着重从应用的角度出发,一步步打造一个管理你的SkyDrive APP。   (而对于一些具体的相关基本概念我会提供查阅链接。)

概念:

1. 关于Sky Drive API的详细资源,来自微软官方的全方位资料:http://msdn.microsoft.com/zh-CN/live

2. 关于REST(Representational State Transfer,表属性状态迁移)。请查阅维基百科的定义:http://zh.wikipedia.org/wiki/REST

 

首先,让我们看看一个windows live id关联到的LIVE连接REST API结构等级。

SkyDrive User Content Model

从上图可以看出微软开放的SkyDrive APIs还是很给力-vable的。

这一系列的APIs提供多种平台的支持, Windows phone,Android, iPhone, Windows 8, WEB等。  其实都是通过HTTP协议请求完成数据的转移。 接下来

我会讲述在Windows phone上面使用Live Connect SDK的应用。

 

第一步:搭建环境。

1. Visual studio for windows phone。 这个是废话了,为了完整还是加上。

2. 你需要进入Live Connect Developer Center完成你的APP授权的申请和登记,因为SkyDrive APIs将会对每个APP进行授权操作,没有这一步你的APP是无法调用到APIs的。

当完成这步操作后, 你会获取到一个ClientID,格式应该像这样(like this: 00000000603E0BFE). 这很重要,接下来调用API来驱动你的SkyDrive网盘都得靠它了。 就像你要使用BingMap必须有个ID一样(习惯就好)。

注意:在创建完成一个你的应用实例后,有一个很重要的任务需要你去完成。 那就是在你创建的应用实例的API Settings配置节中, 将Mobile client app置为True,以标识

你的APP是移动客户端。 如下图:

3. 准备工作就快完成了。 还差一步。

到这里下载SDK,下载LIVE SDK。 下载完成并安装后。打开你的Windows phone项目,添加引用( 在解决方案中, 右击References引用 > 添加引用.), 在 .NET tab页, 找到并同时选择Microsoft.Live.Controls,和Microsoft.Live. 现在, 你就可以引用了:

using Microsoft.Live;
using Microsoft.Live.Controls;

接下来让我们看看有哪些Controls可以使用。  打开工具箱Dock面板,右键选择“选择项”,单击浏览。找到你的LIVE SDK的位置,我的安装位置在:

C:\Program Files\Microsoft SDKs\Live\v5.0\Windows Phone\References目录下,找到Microsoft.Live.Controls.dll。确定即可。
好了,让我们看看工具箱多了些什么控件,乖乖——就一个——“SignInButton”控件,有些小失望吧? 呵呵好吧,其实有总比没有好,其实没有这个控件也是可以的 。

 

至此,准备工作已完成。下篇我们开始进入应用。

 

 转载请说明出处:http://www.cnblogs.com/mehale/archive/2012/05/25/2517800.html,谢谢。

 

posted @ 2012-05-25 11:58 黑择明 阅读(1121) 评论(0) 编辑

我这人很懒,习惯了到处潜水,从cnblogs, 到stackoverflow,从msdn到windowsphonegeek,再到XDA看看怎么野。  我知道我从来不是一个人在战斗,肯定有大批的同类在这样潜伏着。 ...(省略1000字)...  发现有些东西一定得拿出来晒晒,这种思想上的转变存在着某些不言而喻。

 

以前记录了大量的笔记不过都是在自己的Evernote(貌似要上市),cyberarticle上,从这个开篇文章后,我会把一些自认为好的东西贴出来晒晒。

posted @ 2012-05-25 10:38 黑择明 阅读(20) 评论(0) 编辑
  2011年10月17日

无意之中的细节留意让我邂逅到Windows Phone的强大语音控制。

我觉得我应该把这些拿出来分享,不应该让mango的一些强大功能被埋没。

微软的语音控制分3个关键语音KEY指令:

OPEN

FIND

CALL

接下来,一个一个来

1. OPEN 指令,翻译过来就是 打开的意思。 我们长按start按钮,就会有语音提示你输入语音,举例,你说一句: open camera,

好吧,奇迹要发生了,你会发现照相机会被打开。 so easy, 其余的自由发挥好了。

2. Find指令,这个指令是用来查找的。  同样我们长按start按钮后,Find Windows phone.

奇迹不会错过, 你会发现bing 搜索被打开了。

3.CALL指令,  这个指令不用说大家都应该猜到了, CALL Tiny Z,呃,谁打了我电话?

现在,各位明白了吧,不是自己的发音不够纯正,其实它的要求不高,试试你的标准China-english吧!

优秀是一种习惯,转载请说明出处。http://www.cnblogs.com/mehale/archive/2011/10/17/2215656.html
posted @ 2011-10-17 17:38 黑择明 阅读(1527) 评论(6) 编辑
  2011年9月17日

A Tile is a link to an application displayed in Start. There are two types of Tiles – Application Tiles and secondary Tiles.

首先说下这次的更新。在原来的Application Tile的基础上增加front和Back两个面, 通过flip翻转来实现自动的切换。

芒果中,在以前的基础上增加了一个新的玩意,secondary Tiles。这个东西有些创意。它能通过编程方式由终端用户来自己定义一个或多个想要的Tile到start页面,这个Tile可以指向应用程序中某个特定的页面,甚至可以在同一个特定的页面根据不同的参数,来指定多个Tile,只要你喜欢。当然这些Tile都是可以删除,除了APPLICATION TILE之外。

ShellTileSchedule API:

The background images on the front of a Tile can be updated on a recurring schedule, even if your application is not running. The URI of the update background image must be a RemoteURI. The maximum allowed size of the Tile background image is 80 KB. The maximum allowed download time is 30 seconds. If these limits are exceeded, the schedule will be removed after three consecutive failures.

可以通过Schedule来更新Tile,这个更新计划只能更新到background,同时这个背景图片只能来源于

RemoteURI,最大不超过80KB,如果连续3此更新失败,那么此计划会被移除

posted @ 2011-09-17 09:25 黑择明 阅读(78) 评论(0) 编辑
  2011年6月1日

基础skim:

      修改控件的外观有两种方式:(1)通过样式。(2)修改模版。对于(1)样式就不说了,重点是(2),您可以通过修改或替换控件的ControlTemplate来完全替换控件的外观。自定义控件协定的实现体现在三个方面:部件、状态(组)、可视状态。创建控件时建议遵循此 部件&状态模型。那么,何为部件呢?我们来拆分ComboBox控件。如图:

      部件      状态

ComboBox有5个命名部件,每个部件都由控件代码以编程的方式访问,例如当按下DropDownToggle时,弹出Popup并显示所有的项,单击某项时,该项将显示在ContentPresenter中。

可视转换是指当控件从一个状态进入另一个状态时控件的可视外观。

切入正题:

      控件的属性来设置控件的外观是有限的,通过ControlTemplate能做设置属性来改变外观不能做的事情。方法是通过控件的Template属性来指定ControlTemplate,有3钟方式来设置Template属性的值:(1)内联定义ControlTemplate。(2)对ControlTemplate资源的引用。(3)对ControlTemplate Style样式的引用。

1 <Button Content="Custom">
2 <Button.Template>
3 <ControlTemplate TargetType="Button">
4 <!--Define you content here-->
5 </ControlTemplate>
6 </Button.Template>
7  </Button>
1 <Grid x:Name="LayoutRoot" Background="White">
2 <Grid.Resources>
3 <ControlTemplate x:Key="myCT" TargetType="Button">
4 <!--Define you content here-->
5 </ControlTemplate>
6 </Grid.Resources>
7 <Button Content="Custom" Template="{StaticResource myCT}"/>
8 </Grid>
View Code
1 <Grid x:Name="LayoutRoot" Background="White">
2 <Grid.Resources>
3 <ControlTemplate x:Key="myCT" TargetType="Button">
4 <!--Define you content here-->
5 </ControlTemplate>
6 <Style x:Key="myStyle" TargetType="Button">
7 <Setter Property="Template">
8 <Setter.Value>
9 <ControlTemplate TargetType="Button">
10 <!--Define you content here-->
11 </ControlTemplate>
12 </Setter.Value>
13 </Setter>
14 </Style>
15 </Grid.Resources>
16 <Button Content="Custom" Style="{StaticResource myStyle}"/>
17  </Grid>

笔者:推荐使用Style来设置Template属性。

      修改默认外观的按钮之后,当按钮处于不同的状态时(MouseHover,MouseDown)不会有相应的外观变化。所以我们需要根据控件的状态更改控件的外观。使用VisualState对象来指定控件处于特定状态下的外观,VisualState包含Storyboard。无需对Storyboard做任何操作,它是由VisualStateManager来更改状态,当控件进入VisualState.Name属性指定的状态时,Storyboard开始工作,当控件退出该状态时,Storyboard停止工作。

控件状态由位于该控件的类定义的TemplateVisualStateAttribute指定。[TemplateVisualStateAttribute(Name="Normal",GroupName="CommonStates")]。

由外层至内依次是:

 

<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
   
<VisualState x:Name="Normal"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="borderBg" Storyboard.TargetProperty="Color" To="Red" Duration="0:0:0.1"></ColorAnimation>
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard>
<ColorAnimation Storyboard.TargetName="borderBg" Storyboard.TargetProperty="Color" To="Transparent" Duration="0:0:0.1"></ColorAnimation>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>

注意:该属性的位置必须是位于ControlTemplate的根FrameworkElemet元素上设置。

 

 

posted @ 2011-06-01 15:08 黑择明 阅读(160) 评论(0) 编辑
仅列出标题