Как показать телефонную панель с определенным номером в Blackberry Cascades

Я использую Blackberry Cascades 10 Beta 3 SDK с C ++ QT & QML с Blackberry 10 Dev Alpha Simulator и IDE QNX Momentics, и я пытаюсь реализовать возможность щелкнуть по кнопке с номером телефона из QML и вызвать на нее панель набора номера с этим номером, с которой пользователь должен иметь возможность нажать кнопку вызова, и он будет вызывать этот номер. Вот то, что я сделал:

Button {
text: "555-555-5555" //just a sample number - I don't actually use this number
onClicked: Foo.phone(text) //I don't actually use the class name Foo
}

и я имею:

class Foo : public QObject {
Q_OBJECT
public:
...
Q_INVOKABLE void phone(QString number);
}
...

и я имею:

void Foo::phone(QString number) {
bb::system::phone::Phone phone;
phone.requestDialpad(number, bb::system::phone::LineType::Cellular);
}

Но когда я нажимаю на кнопку, она ничего не делает — мне нужно, чтобы появилась клавиатура — кто-нибудь понимает, что я делаю неправильно?

2

Решение

Измените код вашего класса Foo на следующий:

Foo.hpp

#ifndef FOO_HPP_
#define FOO_HPP_

#include <QObject>
#include <bb/system/InvokeManager>

class Foo : public QObject {
Q_OBJECT

public:
Foo();
virtual ~Foo();

Q_INVOKABLE void callNumber(const QString& number);

private Q_SLOTS:
void processInvokeReply(); // This slot handles the result of an invocation

private:
bb::system::InvokeManager* _invokeManager;

Q_DISABLE_COPY(Foo);
};
#endif /* FOO_HPP_ */

foo.cpp:

#include <bb/system/InvokeAction>
#include <bb/system/InvokeReply>
#include <bb/system/InvokeTargetReply>
#include <bb/system/InvokeRequest>
#include <bb/PpsObject>
#include "Foo.hpp"
Foo::Foo() :
_invokeManager(new InvokeManager(this)) {
}Foo::~Foo() {
}

void Foo::processInvokeReply() {
InvokeReply *reply = qobject_cast<InvokeReply*>(sender());     // Get the reply from the sender object

// Check for errors during invocation
switch (reply->error()) {
case InvokeReplyError::BadRequest:
qDebug("[ErrorBadRequest] Invoke Failed!");
break;
case InvokeReplyError::Internal:
qDebug("[ErrorInternal] Invoke Failed!");
break;
case InvokeReplyError::NoTarget:
qDebug("[ErrorNoTarget] Invoke Failed!");
break;
case InvokeReplyError::TargetNotOwned:
qDebug("[ErrorTargetNotOwned] Invoke Failed.");
break;
default:
qDebug("[Odd Error %d] Invoke failed", reply->error());
break;
}
reply->deleteLater();     // Delete the reply later on
}void Foo::callNumber(const QString& number) {
QVariantMap map;
map.insert("number", number);    // required
QByteArray requestData = bb::PpsObject::encode(map, NULL);
InvokeRequest request;
request.setAction("bb.action.DIAL");
request.setData(requestData);
request.setMimeType("application/vnd.blackberry.phone.startcall");
const InvokeTargetReply *reply = _invokeManager->invoke(request);
if (reply) {
QObject::connect(reply, SIGNAL(finished()), this, SLOT(processInvokeReply()));
} else {
qWarning() << "Invoke Failed! InvokeReply is empty.";
}
}

Предоставьте его через код инициализации cpp, где вы запускаете свое приложение:

Foo* _foo = new Foo();
qml->setContextProperty("_foo", _foo);

Затем используйте его в QML следующим образом:

Button {
onClicked: {
_foo.callNumber("555-555-5555")
}
}

ДОБАВЛЕНО:

Также есть более простой способ сделать это:

в main.cpp:

#include <bb/system/phone/Phone>
#include <bb/data/DataSource>

// skipped ...

Q_DECL_EXPORT int main(int argc, char **argv)
{
// ...skipped
qmlRegisterType<bb::system::phone::Phone>("bb.system.phone", 1, 0, "Phone");
bb::data::DataSource::registerQmlTypes();
// ...skipped
}

затем в файле QML:

import bb.cascades 1.0
import bb.system.phone 1.0

// Creates one page with a button. When you tap the button,
// a dial pad with a specific phone number is displayed.

Page {
Container {
layout: DockLayout {
}
verticalAlignment: VerticalAlignment.Center
horizontalAlignment: HorizontalAlignment.Center

Button {
id: callButton
text: "Call me, maybe"
onClicked: {
phone.requestDialpad("(519) 555-0100")
}
}
}
attachedObjects: [
Phone {
id: phone
}
]
}

Подробнее об этом примере читайте здесь — http://developer.blackberry.com/cascades/documentation/device_comm/phone/index.html

2

Другие решения

Других решений пока нет …