如何使用Ubuntu online account API来创建微博QML应用
来源:互联网 发布:python的安装 编辑:程序博客网 时间:2024/05/18 02:58
在这篇文章中,我们将使用Ubuntu SDK所提供的online account API来访问微博的API并显示所需要的内容。这篇文章的重点是展示如何使用online account API的使用。我们将创建一个简单的QML应用。我们最终显示的画面如下:
更多关于QML应用开发的资料可以在地址:https://developer.ubuntu.com/zh-cn/apps/qml/
1)创建一个最基本的应用
我们还是像以前一样使用我们的Ubuntu SDK来创建一个最基本的weibo QML应用。
这样我们就创建了一个最基本的weibo QML应用。你可以使用热键Ctrl + R来运行它虽然它并不能做什么事。
2)加入online account所需要的文件
我们可以参考文章来对online account API有更深的了解。为了能够访问,需要创建如下的文件:
1)weibo.application
它的具体内容如下:
<?xml version="1.0" encoding="UTF-8"?><application> <description>Weibo QML</description> <desktop-entry>weibo.ubuntu_weibo.desktop</desktop-entry> <services> <service id="qml-weibo.ubuntu_qmlweibo"> <description>Watch your favorite Weibo messages</description> </service> </services></application>
2)weibo.service
它的具体的内容为:
<?xml version="1.0" encoding="UTF-8"?><service> <type>sharing</type> <name>Weibo QML</name> <icon>qml-weibo.png</icon> <provider>qml-weibo.ubuntu_plugin</provider> <translations>unity-scope-weibo</translations></service>
3)创建一个plugin文件目录并在它的下面创建
a)Main.qml, 它的内容为:
import Ubuntu.OnlineAccounts.Plugin 1.0OAuthMain {}
b) qml-weibo.ubuntu_plugin.provider,它的内容为:
<?xml version="1.0" encoding="UTF-8"?><provider> <name>Weibo</name> <icon>weibo/icon.png</icon> <translations>unity-scope-weibo</translations> <plugin>generic-oauth</plugin> <domains>.*weibo\.com</domains> <single-account>true</single-account> <template> <group name="auth"> <setting name="method">oauth2</setting> <setting name="mechanism">web_server</setting> <group name="oauth2"> <group name="web_server"> <setting name="Host">api.weibo.com</setting> <setting name="AuthPath">oauth2/authorize</setting> <setting name="TokenPath">oauth2/access_token</setting> <setting name="RedirectUri">https://api.weibo.com/oauth2/default.html</setting> <setting name="ResponseType">code</setting> <setting name="ClientId">your developer key</setting> <setting type="as" name="AllowedSchemes">['https','http']</setting> <setting name="ClientSecret">your developer secret</setting> <setting name="ForceClientAuthViaRequestBody" type="b">true</setting> </group> </group> </group> </template></provider>
在上面的文件中一定要输入自己的“your developer key”及“your developer secret”。这个你需要在微博API的网站上去申请。整个文件的架构为:
4)修改manifest.json文件如下:
{ "name": "qml-weibo.ubuntu", "description": "description of qml-weibo", "architecture": "all", "title": "qml-weibo", "hooks": { "qmlweibo": { "account-application": "weibo.application", "account-service": "weibo.service", "apparmor": "qmlweibo.apparmor", "desktop": "qmlweibo.desktop" }, "plugin": { "account-provider": "plugin/qml-weibo.ubuntu_plugin.provider", "account-qml-plugin": "plugin/qml" } }, "version": "0.1", "maintainer": "XiaoGuo, Liu <xiaoguo.liu@canonical.com>", "framework": "ubuntu-sdk-14.10"}
这里添加了account及plugin的一些设置。
5)为了能够让.service,.application及.provider文件能正常得到显示,我们对“qml-weibo.qmlproject”添加如下的东西:
Files { filter: "*.service" } Files { filter: "*.application" } Files { filter: "*.provider" }
到这里,我们已经基本上已经修改或添加好我们所需要的文件。
3)设计应用的UI
我们来修改我们的main.qml文件。我们使用了一个Column的列layout manager来管理我们的控件。
- 使用一个ListView (accountsList)来显示所有我们相关的账号。这个可以在“系统设置”中的“账号”可以看到
- 使用一个叫做“createAccountBtn”的按钮来创建一个weibo的online账号
- 使用另外一个ListView (weiboList)列表来显示微博的内容
import QtQuick 2.0import Ubuntu.Components 0.1import Ubuntu.Components.ListItems 0.1 as ListItemimport Ubuntu.OnlineAccounts 0.1import Ubuntu.OnlineAccounts.Client 0.1import "weiboapi.js" as API/*! \brief MainView with a Label and Button elements.*/MainView { id: main // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest applicationName: "qml-weibo.ubuntu" /* This property enables the application to change orientation when the device is rotated. The default is false. */ //automaticOrientation: true property string accesstoken:"" width: units.gu(100) height: units.gu(90) Page { id: root clip:true title: i18n.tr("Weibo") Column { spacing: units.gu(2) width: parent.width ListView { id: accountsList anchors.horizontalCenter: parent.Center anchors.verticalCenter: parent.Center height: contentHeight width: parent.width spacing: units.gu(1) model: accountsModel delegate: Rectangle { id: wrapper width: accountsList.width height: units.gu(10) color: accts.enabled ? "green" : "red" AccountService { id: accts objectHandle: accountServiceHandle onAuthenticated: { console.log("reply: " + JSON.stringify(reply)); var obj = JSON.parse(JSON.stringify(reply)); console.log("AccessToken: " + obj.AccessToken); main.accesstoken = obj.AccessToken; // Make the authenticate button invisile accountsList.visible = false; // Start to get the data API.getStatus(); } onAuthenticationError: { console.log("Authentication failed, code " + error.code) // accountsList.headerItem.text = "Error " + error.code authenticateBtn.text = displayName + " Error " + error.code + " please do it again"; } } Button { id: authenticateBtn anchors.fill: parent anchors.margins: units.gu(2) text: i18n.tr("Authenticate %1").arg(model.displayName + " " + model.providerName) onClicked: { var params = {} accts.authenticate(params) } } } } Button { id: createAccountBtn anchors.horizontalCenter: parent.horizontalCenter width: parent.width height: units.gu(8) text: i18n.tr("Request access") onClicked: setup.exec() } ListModel { id: modelWeibo } ListView { id: weiboList width: parent.width height: parent.height spacing: units.gu(1) model: modelWeibo delegate: Rectangle { width: parent.width height: units.gu(8) color: "lightgrey" BorderImage { id: image source: {return JSON.parse('' + JSON.stringify(user) + '').profile_image_url} width: parent.height; height: parent.height border.left: 5; border.top: 5 border.right: 5; border.bottom: 5 } Column { spacing: units.gu(1) x: image.width + 10 width: parent.width - image.width - 20 height: parent.height Text { id: title text: {return JSON.parse('' + JSON.stringify(user) + '').name } } Text { id: subtitle text: {return model.text } } } } } } } AccountServiceModel { id: accountsModel // serviceType: "" applicationId: "qml-weibo.ubuntu_qmlweibo" } Setup { id: setup providerId: "qml-weibo.ubuntu_plugin" applicationId: "qml-weibo.ubuntu_qmlweibo" onFinished: { createAccountBtn.visible = false; } } Component.onCompleted: { if ( accountsModel.count == 0 ) { // If there is no such an account, we need to create such one setup.exec(); } else { // hide the button since the account has already been created createAccountBtn.visible = false } }}
我们通过设计weiboapi.js文件来帮我们来得到微博的具体的内容:
////////////////////////////////////////////////////////////////////////////////////// weibo//home statusfunction weiboHomeStatus(token, page , observer){ var url = "https://api.weibo.com/2/statuses/home_timeline.json?access_token=" + token + "&page=" + page console.log("home status start...") console.log("url: " + url); var doc = new XMLHttpRequest(); doc.onreadystatechange = function() { if (doc.readyState == XMLHttpRequest.HEADERS_RECEIVED) { console.log(" home status in progress..."); } else if (doc.readyState == XMLHttpRequest.DONE) { if(doc.status != 200) { console.log("!!!Network connection failed!") observer.update("error", doc.status) } else { console.log("-- home status succeeded !"); if(doc.responseText == null) { observer.update("null", doc.status) } else { // console.log("home status: done" + doc.responseText) console.log("Some data received!") var json = JSON.parse('' + doc.responseText+ ''); observer.update("fine", json); } } } } doc.open("GET", url, true); doc.setRequestHeader("Content-type", "application/json"); doc.send();}function getStatus() { // We can get some data from the web and display them console.log("Going to get some data from web") function observer() {} observer.prototype = { update: function(status, result) { console.log("got updated!"); if(status != "error"){ if( result.error ) { console.log("result.error: " + result.error); }else { console.log("got updated1!"); for ( var i = 0; i < result.statuses.length; i++) { modelWeibo.append( result.statuses[i] ) } } }else{ console.log("Something is wrong!"); } } } weiboHomeStatus(main.accesstoken, 1, new observer() );}
整个应用的源码在地址
https://github.com/liu-xiao-guo/weiboqml
当所有的账号文件被成功创建后,我们可以在手机的如下目录看到所有的文件:
0 0
- 如何使用Ubuntu online account API来创建微博QML应用
- 如何使用Ubuntu online account API来创建微博HTML5应用
- 如何使用online account来创建微博Scope
- 如何在QML中使用camera API来拍照
- 使用QML来创建界面
- 使用QML来创建界面
- 如何在QML应用中使用Javascript来解析XML
- 如何在Ubuntu QML应用中使用Push Notification
- Qt: 使用QML来创建界面
- 利用golang和QML来开发Ubuntu应用
- Ubuntu SDK 第一节 -- 创建一个简单的QML应用
- 在QML应用中使用Canvas来画图
- 如何在Ubuntu QML应用中播放音乐
- 如何在Ubuntu QML应用中播放视频
- 如何在Ubuntu QML应用中震动(vibration)
- 如何在Ubuntu QML应用中进行语言录音
- 如何在Ubuntu QML应用中实现MultipleSelectionListView
- 如何在Ubuntu QML应用中实现ComboBox的功能
- 通达OA 开始移动端技术研究
- Android上的内存分配策略优化
- sqlserver批量附加 批量分离数据
- UVa #1632 Alibaba (习题9-8)
- MySQL表结构复制、表数据迁移以及临时表、视图创建
- 如何使用Ubuntu online account API来创建微博QML应用
- ORACLE 分析函数(转)
- [LeetCode] Minimum Window Substring
- SpringBoot uses mysql as the database
- 浅谈操作系统对内存的管理
- java 项目得到jar和classes路径
- Javascript继承的最佳实践
- Android常见知识点
- 创建xmlhttprequest对象