在Ubuntu平台上面,我们可以使用History API来读取电话本及短信的内容,并使用listview来显示出来。下面我们来展示该怎么做。
1)创建一个基本的QML应用
我们使用Qt Creator来创建一个最基本的QML应用。我们选择使用“App with Simple UI"模版来创建我们的应用。
为了使用History API, 我们必须引入
import Ubuntu.History 0.1
ComboButton {
id: type
expanded: false
text: "Voice"
ListView {
model: typemodel
delegate: ListItem.Standard {
text: modelData
onClicked: {
console.log("item is clicked!" + index + " " + name);
type.expanded = false;
type.text = text;
console.log("type is: " + type.text);
if ( name === "Voice") {
historyEventModel.type = HistoryThreadModel.EventTypeVoice;
listView.model = historyEventModel
} else if ( name === "Text" ) {
historyEventModel.type = HistoryThreadModel.EventTypeText;
listView.model = historyEventModel
} else if ( name === "Thread") {
listView.model = historyThreadModel
}
}
}
}
}
这里我们可以参考
ComboButton来更加多了解如何使用这个控件。这里,我们提供了三个选项"
Voice", "
Text" 及“
Thread"。同时我们也创建了俩个不同的history model。
HistoryEventModel {
id: historyEventModel
filter: HistoryFilter {}
type: HistoryThreadModel.EventTypeVoice
sort: HistorySort {
sortField: "timestamp"
sortOrder: HistorySort.DescendingOrder
}
}
SortProxyModel {
id: sortProxy
sortRole: HistoryEventModel.TimestampRole
sourceModel: historyEventModel
ascending: false
}
HistoryThreadModel {
id: historyThreadModel
filter: HistoryFilter {}
sort: HistorySort { sortField: "lastEventTimestamp" sortOrder: HistorySort.DescendingOrder
}
由于一些性能方面的原因的考虑,目前我们必须把filter设置为空,即:
filter: HistoryFilter {}
我们同时也把上面定义的model和我们的ListView一起连接起来:
ListView {
id: listView
width: parent.width
height: parent.height - type.height
Component {
id: sectionDelegate
Text {
text: section
}
}
model: historyEventModel
delegate:
...
}
目前似乎一切都已经好了。接下来我们来运行我们的应用到手机中。我们会发现在手机中没有任何的history的东西显示。问题出现在哪里呢?
我们开启一个terminal,然后打入如下的命令:
$adb shell
然后再在手机中的命令行输入:
root@ubuntu-phablet:~# grep "DENIED" /var/log/syslog
我们可以看到如下的图片:
显然,我们遇到了一个安全的问题。为了接的这个问题,我们必须在应用中加入它所需要的policy。
我们再重新运行程序。在手机上,我们可以看到如下的画面:
我们再也没有security的问题了。整个工程的源码在如下的地址可以下载:
bzr branch
lp:~liu-xiao-guo/debiantrial/history