Qt怎么获取android 9.0下载安装手机的连接状态

  版权声明:本文为MULTIBEANS ORG研发跟随文章,未经MLT ORG允许不得转载。
  最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本的, 就没选择,博主在大二的时候学习过Java SE基本的语法,写过一些小程序就放弃了Java的道路。最后选择了蓝牙无线透传模块,实现串口通信。现在Qt跨平台支持安卓,是在是令人欣喜。在网上找资料,用Qt on Android做蓝牙驱动的几乎没有,也没有相关例程,所以准备撰写此文,献给广大嵌入式程序员们
  更新:
& & & &增加Java版本的蓝牙通信,文章地址:https://www.cnblogs.com/sigma0/p/9234478.html
一、软硬件平台
1.1 硬件平台
1. 蓝牙:HC-05,(淘宝上有卖),它的接口就是跟串口一样的,我们用到了TX,RX,GND,VCC四个引脚。跟下位机或者用CH340G TTL转USB模块接到PC机上。蓝牙工作在串口模式可以通过AT指令调节。具体参考蓝牙配套的说明文档,最主要的就是请将蓝牙设定为从机模式,否则安卓手机搜寻链接不上。2.安卓手机:我这里测试用了2台安卓手机,一台是小米4移动版,安卓版本6.0.1;一台是MOTO MT887,安卓版本4.1.2。
1.2 软件平台
本项目Qt版本是5.7,系统是windows 8.1 x64
二、软件基本介绍
  因为第一次做蓝牙,就做一个非常简单的雏形,实现蓝牙状态检测、蓝牙的开关、蓝牙的扫描和蓝牙配对链接,并且能像串口助手一样完成数据收发。如图,就是本一开始做的最简单的软件界面,本软件基于QWidget控件制作,当然你可以选择mainwinodw,更可以自己定义类。
  我不用介绍每个部位是什么了,都会明白吧?蓝牙打开后通过扫描,会将蓝牙的MAC地址还有名字显示在List中,我们双击List列表中的蓝牙,就会进入actived信号连接的槽函数,执行蓝牙的配对连接。建立连接之后,就类似串口一样可以进行数据通信了。另外,点击send按钮之后会发送一堆字符串。
三、 蓝牙开发
3.1 项目文件准备
需要用到蓝牙就需要在.pro文件中引入库,我没有用Qt quick,用的是纯C++写的代码,你需要在.pro文件中加入这句话:
QT += bluetooth
如果没有这句话的话,包含蓝牙目录下的头文件,会提示找不到该文件。
之后就是要包含一些蓝牙用到的头文件:
#include &QtBluetooth/qbluetoothglobal.h&
#include &QtBluetooth/qbluetoothlocaldevice.h&
#include &qbluetoothaddress.h&
#include &qbluetoothdevicediscoveryagent.h&
#include &qbluetoothlocaldevice.h&
#include &qbluetoothsocket.h&
  一会儿介绍每个都是做什么的。
请在类中声明定义蓝牙相关句柄:
QBluetoothDeviceDiscoveryAgent *discoveryA
QBluetoothLocalDevice *localD
QBluetoothSocket *
  第一个discoveryAgent是用来对周围蓝牙进行搜寻,localDevice顾名思义,就是对本地设备进行操作,比如进行设备的打开,设备的关闭等等。socket就是用来进行蓝牙配对链接和数据传输的。这里要用到这三个。
3.2 蓝牙开关和可见性设定
在构造函数中,请为localDevice使用new运算符分配内存。
localDevice = new QBluetoothLocalDevice();
1) 蓝牙开关
本设计在运行APP的时候,会检测一下我们本地设备的蓝牙是否打开,如果判断是开启状态,我们可以将打开蓝牙的按钮disable掉,将关闭蓝牙的按钮enable,所以在APP运行的时候需要进行蓝牙状态检测。检测方法如下:
进行一个这样的检测,对本地设备模式进行判断。
if( localDevice-&hostMode() == QBluetoothLocalDevice::HostPoweredOff )
ui-&pushButton_openBluetooth-&setEnabled(true);
ui-&pushButton_closeDevice-&setEnabled(false);
ui-&pushButton_openBluetooth-&setEnabled(false);
ui-&pushButton_closeDevice-&setEnabled(true);
在构造函数中
那么,我们如何来对蓝牙进行打开和关闭呢?我在open按钮和close按钮的槽函数中对蓝牙进行开关操作。
open按钮的槽函数:
void Widget::on_pushButton_openBluetooth_clicked()
localDevice-&powerOn();
ui-&pushButton_closeDevice-&setEnabled(true);
ui-&pushButton_openBluetooth-&setEnabled(false);
ui-&pushButton_scan-&setEnabled(true);
localDevice-&powerOn();方法调用打开本地的蓝牙设备,然后你可以根据自己的喜好完成对按钮的使能和禁止操作。
close按钮的槽函数:
void Widget::on_pushButton_closeDevice_clicked()
localDevice-&setHostMode(QBluetoothLocalDevice::HostPoweredOff);
ui-&pushButton_closeDevice-&setEnabled(false);
ui-&pushButton_openBluetooth-&setEnabled(true);
ui-&pushButton_scan-&setEnabled(false);
close设备和我们的open设备的方法在形式上不一样,我还以为他们两个是对称的,但是事实上不是,只能用这样的方法对蓝牙进行关闭。
2) 蓝牙可见性
  同样地,在蓝牙使用过程中,安卓手机提供了蓝牙是否可以被其他蓝牙搜索到这样的功能,也就是蓝牙可见,我们也可以用localDevice下的HostMode()方法,对这个状态进行检测。如下:
if( localDevice-&hostMode() == QBluetoothLocalDevice::HostDiscoverable ) {
ui-&checkBox_discoverable-&setChecked(true);
ui-&checkBox_discoverable-&setChecked(false);
我的设计中,蓝牙可见如界面图用的是checkBox空间完成的,通过setChecked()方法,一开机对是否可见进行。
在翻转checkBox的时候,会激发进入checkBox的槽函数,我们在checkBox的槽函数中,完成对蓝牙可见性的设定。代码如下:
localDevice-&setHostMode( QBluetoothLocalDevice::HostDiscoverable);
同理,不可见你也能想到对吧。
3.3 蓝牙设备的查找
  使用蓝牙设备的查找,就要用到&discoveryAgent 这个类的实例化。我们需要在构造函数中对discoveryAgent =new QBluetoothDeviceDiscoveryAgent();分配内存。然后就可以使用这个类的方法来对蓝牙进行查找了。除此之外,还要进行一个信号和槽的链接。
connect(discoveryAgent,
SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo))
  在我们发现设备的时候,这个deviceDiscovered信号被触发,进入到addBlueToothDevicesToList的函数中。在上面的软件界面,我们的最上面蓝牙列表下的控件是ListIte控件,这里做一个槽函数,将发现的设备打印到这个列表中列出来。
void Widget::addBlueToothDevicesToList( const QBluetoothDeviceInfo &info )
QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
QList&QListWidgetItem *& items = ui-&list-&findItems(label, Qt::MatchExactly);
if (items.empty()) {
QListWidgetItem *item = new QListWidgetItem(label);
QBluetoothLocalDevice::Pairing pairingStatus = localDevice-&pairingStatus(info.address());
if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
item-&setTextColor(QColor(Qt::green));
item-&setTextColor(QColor(Qt::black));
ui-&list-&addItem(item);
  这里给出这个函数,每一句话十分的好理解,这里增加点选操作,当点击listItem中的项目的时候,背景颜色会翻转,双击这个项目就会和这个蓝牙设备建立连接,这里有个actived槽函数,在这个槽函数里面就会进行蓝牙的链接。下一章节写这个如何连接。
3.4 蓝牙设备的建立连接
  在说蓝牙设备连接之前,不得不提一个非常重要的概念,就是蓝牙的Uuid,引用一下百度的:
  在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" (UUID)来校验。正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。UUID类可表现为短整形(16或32位)和长整形(128位)UUID。他提供了分别利用String和16位或32位数值来创建类的构造函数,提供了一个可以比较两个UUID(如果两个都是128位)的方法,还有一个可以转换一个UUID为一个字符串的方法。UUID实例是不可改变的(immutable),只有被UUID标示的服务可以被发现。在Linux下你用一个命令uuidgen -t可以生成一个UUID值;在Windows下则执行命令uuidgen 。UUID看起来就像如下的这个形式:2dfb-47c2-8d9f-10b8ec891363。当使用生成的UUID去创建一个UUID对象,你可以去掉连字符。
在我们的项目中,用到的模式是串口模式,我们需要建立一个存储Uuid的机制,如下:
static const QLatin1String serviceUuid("0-805F9B34FB");
这个字符串里面的内容就是串口模式的Uuid,如果你开发的蓝牙也是要使用串口,你直接Copy过去就可以了,如果你使用其他模式,自己去找这个Uuid码是多少。
在使用蓝牙建立连接,需要建立蓝牙socket服务。请在构造函数中增加对socket的分配内存,要注意的是构造函数中的参数需要给定模式。
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
  在Qt文档中,给了3中模式,具体如何这里不做引申,读者需要请自己查询文档。但RfcommProtocol,属于模拟RS232模式,我就叫串口模式了。
  在上一节中说了,当双击ItemList控件中的项目时候,会进入到actived槽函数和蓝牙进行链接,那么如何连接呢?在itemList中会打印一个蓝牙的MAC地址信息,我们会将这个Mac地址保存在QBluetoothAddress这个类的实例化中,并将这个address传递给socket,作为链接依据。
void Widget::itemActivated(QListWidgetItem *item)
QString text = item-&text();
int index = text.indexOf(' ');
if (index == -1)
QBluetoothAddress address(text.left(index));
QString name(text.mid(index + 1));
qDebug() && "You has choice the bluetooth address is " &&
qDebug() && "The device is connneting.... ";
QMessageBox::information(this,tr("Info"),tr("The device is connecting..."));
socket-&connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
  我们通过对字符串的处理,将得到address信息。通过socket-&connectToService(....),把地址,Uuid,和蓝牙模式传递进去,当执行完这句话的时候,安卓手机开始和你
&  选择的蓝牙设备进行链接。
  同样在socket中也提供了丰富的槽函数,比如成功建立连接信号,成功断开信号,这里在槽函数中可以做一些例子,这里给出例子:
connect(socket,
SIGNAL(connected()),
SLOT(bluetoothConnectedEvent())
connect(socket,
SIGNAL(disconnected()),
SLOT(bluetoothDisconnectedEvent())
void Widget::bluetoothConnectedEvent()
更新一下,请在这里插入关闭蓝牙查找服务,否则数据会断。
// 具体语句是什么我忘记了,反正使用discoveryAgent的一个什么close,或者stop的方法
qDebug() && "The android device has been connected successfully!";
QMessageBox::information(this,tr("Info"),tr("successful connection!"));
void Widget::bluetoothDisconnectedEvent()
qDebug() && "The android device has been disconnected successfully!";
QMessageBox::information(this,tr("Info"),tr("successful disconnection!"));
最后,还有一个断开连接函数。通过断开连接按钮的槽函数实现。
void Widget::on_pushButton_disconnect_clicked()
socket-&disconnectFromService();
3.5 发送和接收数据
  蓝牙发送和接收数据,也是通过socket进行。发送数据十分简单:
void Widget::on_pushButton_send_clicked()
QByteArray arrayD
QString s("Hello Windows!!!\nThis message is sended via bluetooth of android device!\n");
arrayData = s.toUtf8();
socket-&write(arrayData);
这里通过socket-&write函数,完成发送。发送之后,上位机,我用的串口助手会显示该信息。
串口助手接受到信息
那么接收数据呢?
我们在构造函数中,需要建立这样的一个信号和槽的链接:
connect(socket,
SIGNAL(readyRead()),
SLOT(readBluetoothDataEvent())
readyRead()信号触发,跳进readBluetoothDataEvent中。
void Widget::readBluetoothDataEvent()
QByteArray line = socket-&readAll();
QString strData = line.toHex();
comStr.append(strData);
qDebug() &&"rec data is: "&& comS
qDebug() &&"The comStr length is: " && comStr.length();
if(comStr.length() &= 30) {
ui-&textBrowser_info-&append(comStr + "\n");
comStr.clear();
我这里是这样处理的,当然了,你有你自己的处理方法,意思就是那么个意思。
四、结束语
完成对蓝牙的开发,实现了最基本的功能,这里为了讲述用Qt开发蓝牙在安卓设备上,用了最简单最简单的例子,给你一个思路框架方法,如果追求极高的稳定性,好需要自
己深入研究,这里不做讨论。欢迎批评指正,我也是一个求学者,大家共同交流,共同进步。最后,贴上源码,仅供大家参考。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
百度云链接:
提取码: zykk
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
阅读(...) 评论()Qt安卓遇到这个问题,请问怎么解决【qt吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:39,095贴子:
Qt安卓遇到这个问题,请问怎么解决收藏
BUILD FAILEDF:\Qt\Android\settings\android-sdk-windows\tools\ant\build.xml:705: The following error occurred while executing this line:F:\Qt\Android\settings\android-sdk-windows\tools\ant\build.xml:718: Class not found: javac1.8Total time: 3 secondsBuilding the android package failed! -- For more information, run this command with --verbose.14:44:40: 进程&F:\Qt\Android\5.7\android_armv7\bin\androiddeployqt.exe&退出,退出代码 14 。Error while building/deploying project untitled1 (kit: Android for armeabi-v7a (GCC 4.9, Qt 5.7.0))When executing step &Build Android APK&
要装jdk,并且要把jdk加入path
登录百度帐号后使用快捷导航没有帐号?
目前在做把原有的QML写的项目移植到Android设备上,其中用到了第3方库文件,目前的情况是编译和部署到虚拟机都成功了,就是虚拟机端运行程序的时候提示“Unfortunately,mainview has stooped”,经高手指点看了下apk文件中的libs目录下确实没有第3方的库文件,但是我在项目的pro中用LIBS+=的方式指定了库,pro中的添加库语句是通过右击项目添加库自动生成的应该没问题吧。但是最终就是没有在apk中生产库。是不是还需要其他的操作才能达到库在apk的libs目录下呢?还是说不需要libs目录下有第3方库呢?等待高手解答
清除---qmake---重新构建---运行
charles_gz 发表于
尝试了你说的那个方法没有效果。也尝试了通过在pro中添加QMAKE_POST_LINK += copy -f dir1 dir2 的方法也 ...
清除---qmake---重新构建---运行
通过查询和高手指点知道存在ANDROID_EXTRA_LIBS宏是专门添加第3方库的,可是我这写了
ANDROID_EXTRA_LIBS+= D:\Qt_Android\demo\lib\libbaseshapes.so& & D:\Qt_Android\demo\lib\libbasecshapes.so 最后编译生成的apk的lib目录下还是没有第3方库,郁闷了,在线等待解答
charles_gz 发表于
通过查询和高手指点知道存在ANDROID_EXTRA_LIBS宏是专门添加第3方库的,可是我这写了
ANDROID_EXTRA_LIBS+= ...
我觉得应该是这么写吧
ANDROID_EXTRA_LIBS+= &D:/Qt_Android/demo/lib/libbaseshapes.so&
Syylc120317 发表于
我觉得应该是这么写吧
ANDROID_EXTRA_LIBS+= &D:/Qt_Android/demo/lib/libbaseshapes.so&
哦,那我一会试试,谢谢指点
Syylc120317 发表于
我觉得应该是这么写吧
ANDROID_EXTRA_LIBS+= &D:/Qt_Android/demo/lib/libbaseshapes.so&
尝试了你说的那个方法没有效果。也尝试了通过在pro中添加QMAKE_POST_LINK += copy -f dir1 dir2 的方法也不行。
Syylc120317 发表于
清除---qmake---重新构建---运行
现在在apk包中看到第3方库了,采用了非绝对路径。谢谢你的解答。
主题帖子积分
Qter2级会员, 积分 120, 距离下一级还需 180 积分
Qter2级会员, 积分 120, 距离下一级还需 180 积分不积跬步无以至千里~
Qt for Android调用Android接口将程序移到后台/前台运行
在用Qt开发android应用的时候碰到这样的需求,点击某按钮后将程序最小化,也就是说将其移到后台运行,程序本身没有退出,这相当于点击了Home键。而当程序收到某个广播后又将后台运行的程序打开显示到最前端,原理很简单,同样还是先通过android接口实现相应功能,然后在C++端调用。
首先,如果是一个新创建的Qt工程,需要创建一个AndroidManifest.xml文件,创建过程不再赘述,然后创建一个的类,继承于
public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity
定义一个公有的静态函数
最小化,将程序移到后台:
public static void mini()
m_instance.moveTaskToBack(true);
}其中m_instance是本窗口对象this
将软件移到前台
public static void moveTaskToFrount(){
if(!m_instance.isForeground(m_instance.getPackageName()))
ActivityManager am = (ActivityManager)m_instance.getSystemService(Context.ACTIVITY_SERVICE);
am.moveTaskToFront(m_instance.getTaskId(),0);
private boolean isForeground(String packageName){
ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
List&RunningAppProcessInfo& appProcesses = activityManager
.getRunningAppProcesses();
if (appProcesses == null)
for (RunningAppProcessInfo appProcess : appProcesses) {
// The name of the process that this object is associated with.
if (appProcess.processName.equals(packageName)
&& appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
需要导入包
import android.app.ActivityM
import android.app.ActivityManager.RunningAppProcessI
import android.app.ActivityManager.RunningAppProcessI
然后看C++ 调用
void AndroidInterface::showMini()
QAndroidJniObject::callStaticMethod&void&(
"com/lyy/test/MainActivity",
}void AndroidInterface::moveToFront()
QAndroidJniObject::callStaticMethod&void&(
"com/lyy/test/MainActivity",
"moveTaskToFrount",
QtAndroid详解(6):集成信鸽推送
Qt on Android 在一个Android服务中使用信号与槽
Qt on Android 启动一个Android的服务(Service)
QtAndroid详解(2):startActivity和它的小伙伴们
谈谈Qt on Android
QtAndroid详解(4):JNI调用Android系统功能(1)
QtAndroid详解(5):JNI调用Android系统功能(2)
Qt on Android:使用JNI与第三方jar包
QT5 for android
实现横屏锁定
苦逼啊--qt for android 5.4.1 camera
没有更多推荐了,qt on android之GPS信号的获取
时间: 18:58:22
&&&& 阅读:1686
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&0. & & &写在最前面
本人参考安晓辉大侠的一篇博文后,做了Qt on android的GSP相关的实验,为了后面不时之需,故而记录下来。
1.&&&&&&Qt on Android GPS系统流程
图1. 系统流程图
如图1所示,系统含两个层面:其一为基于QT的UI,提供启动GPS的按钮(QPushButton),以及显示GPS信号的文本域(QTextBrowser);其二为基于Activity的GPS服务,提供GPS的启动,GPS信号上报等服务。两个层面的交互及C++与Java的交互通过JNI来实现。
系统的整体线索如箭头方式所示:在QT层,按钮被点击后,槽函数startGps被触发,该函数调用Activity层的方法calledByCpp,而calledByCpp方法发送消息到mes handle,消息类型为MSG_STR_GPS_LOC,handle收到消息后,调用函数startAmap启动GPS的定位。GPS启动后,位置的实时信息在函数onLocationChanged()函数中发布,该函数把位置信息通过消息发送给msg
handle,其中消息类型为MSG_RPT_GSP_INF,handle再调用native方法reportGpsInfo,就可以把消息发送给QT层。
2.&&&&&&创建Android工程
图2 创建工程
工程命名为QtAndroidGps,且其路径为E:\work\c++\qt,工程创建之后,目录结构如下:
图3. 工程初始文件
在上述自动生成目录下加入文件夹android:
图4. 加入文件夹android后
文件夹android里面包含如下内容:
图5. 文件夹android的内容
可以看出,目录结构与通过eclipse生成的android工程类似,少了assets,bin,gen,res等目录,以及project.properties等文件。
本工程可采用百度与高德的库来定位,其相关的jar包分别为BaiduLBS_Android.jar与Android_Location_V1.1.2.jar,这两个包均放入到e:\work\c++\qt\QtAndroid\android\libs。
同时,在构建工程QtAndroidGps之后,qt会在路径e:\work\c++\qt\之下自动生成目录:
E:\work\c++\qt\build-QtAndroidGps-Android_for_armeabi_v7a_GCC_4_8_Qt_5_4_0-Debug,该目录包含以下文件:
图6. qt构建工程后生成的工程目录
其中,android-build目录包含qt构建出来的android工程,该工程即为完整的android工程:
图7. qt构建工程后生成的android工程目录
可以发现,之前我们人为创建的工程e:\work\c++\qt\QtAndroid\android\里面的文件除了AnroidManifest.xml被整合外,其他文件包括jar包和java文件都被拷贝入:
build-QtAndroidGps-Android_for_armeabi_v7a_GCC_4_8_Qt_5_4_0-Debug。
3.&&&&&&工程文件清单
3.1 E:\work\c++\qt\QtAndroidGps\android\AndroidManifest.xml
图8.&AndroidManifest.xml
该文件有如上图标注的4个重要点:
①& -&与E:\work\c++\qt\QtAndroidGps\android\src中java文件的包路径对应
②& -&要把百度与高德的包用起来,必须加入Api-key
③& -&对应Activity的类名
④& -&需要开启GPS定位相关的权限
3.2.1&E:\work\c++\qt\QtAndroidGps\mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include &QMainWindow&
#include &QPushButton&
namespace Ui {
class MainW
class MainWindow : public QMainWindow
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
bool event(QEvent *e);
Ui::MainWindow *
QPushButton * // 点击启动GPS
private slots:
void startGps(); // btn对应的点击槽函数
#endif // MAINWINDOW_H
3.2.2&E:\work\c++\qt\QtAndroidGps\mainwindow.cpp
#include &mainwindow.h&
#include &ui_mainwindow.h&
#include &QAndroidJniObject&
#include &CustomEvent.h&
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui-&setupUi(this);
btn = new QPushButton(&start&, this);
btn-&setGeometry(QRect(10, 10, 100, 50));
connect(btn, SIGNAL(clicked()), this, SLOT(startGps()));
MainWindow::~MainWindow()
void MainWindow::startGps()
//QAndroidJniObject javaAction = QAndroidJniObject::fromString(url);
QAndroidJniObject::callStaticMethod&void&( /* 调用java方法,详细情况请参考qt的帮助文档 */
&com/mtn/mes/GpsService&,
&calledByCpp&,
bool MainWindow::event(QEvent *e)
if(e-&type() == CustomEvent::eventType()){ /* 匹配上自定义事件类型 */
e-&accept();
CustomEvent *sce = (CustomEvent*)e;
//_resultView-&setText(sce-&m_arg2);
ui-&textBrowser-&setText(sce-&m_arg2); /* 显示GPS信息 */
return QWidget::event(e);
3.3.1&E:\work\c++\qt\QtAndroidGps\CustomEvent.h
#ifndef CUSTOMEVENT_H
#define CUSTOMEVENT_H
#include &QEvent&
#include &QString&
class CustomEvent : public QEvent
CustomEvent(int arg1 = 0, const QString &arg2 = QString());
~CustomEvent();
static Type eventType();
int m_arg1;
QString m_arg2;
static Type m_evT
#endif // CUSTOMEVENT_H
3.3.2&E:\work\c++\qt\QtAndroidGps\CustomEvent.cpp
#include &CustomEvent.h&
QEvent::Type CustomEvent::m_evType = (QEvent::Type)QEvent::N
CustomEvent::CustomEvent(int arg1, const QString &arg2)
: QEvent(eventType()), m_arg1(arg1), m_arg2(arg2)
CustomEvent::~CustomEvent()
QEvent::Type CustomEvent::eventType()
if(m_evType == QEvent::None)
m_evType = (QEvent::Type)registerEventType(); /* 注册自定义事件,返回m_evType值为qt分配的自定义事件类型 */
return m_evT
3.4&E:\work\c++\qt\QtAndroidGps\CustomEvent.cpp
#include &mainwindow.h&
#include &QApplication&
#include &QDebug&
#include &jni.h&
#include &QAndroidJniEnvironment&
#include &QAndroidJniObject&
#include &CustomEvent.h&
QObject *main_window = 0;
/* 该函数被java的本地方法调用 */
static void reportGpsInfo(JNIEnv *env, jobject thiz,int result, jstring data)
QString qstrD
const char *nativeString = env-&GetStringUTFChars(data, 0);
qstrData = nativeS
env-&ReleaseStringUTFChars(data, nativeString);
QCoreApplication::postEvent(main_window, new CustomEvent(result, qstrData)); /* 发送事件(携带GPS信息)给主窗口,自定义事件类型 */
qDebug() && qstrD
bool registerNativeMethods()
JNINativeMethod methods[] {
{&reportGpsInfo&, &(ILjava/lang/S)V&, (void*)reportGpsInfo} /* 注册本地方法,java方可调用,详细信息见qt帮助文档 */
const char *classname = &com/mtn/mes/ExtendsQtNative&;
QAndroidJniE
QAndroidJniObject javaClass(classname);
clazz = env-&GetObjectClass(javaClass.object&jobject&());
qDebug() && &find ExtendsQtNative - & &&
bool result =
if(clazz) {
jint ret = env-&RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0]));
env-&DeleteLocalRef(clazz);
qDebug() && &RegisterNatives return - & &&
result = ret &= 0;
if(env-&ExceptionCheck()) env-&ExceptionClear();
int main(int argc, char *argv[])
QApplication a(argc, argv);
CustomEvent::eventType(); // 注册自定义事件,生成自定义事件类型
registerNativeMethods();
// 注册本地方法
main_window = qobject_cast&QObject*&(&w);
return a.exec();
3.5&E:\work\c++\qt\QtAndroidGps\android\src\com\mtn\mes\ExtendsQtNative.java
package com.mtn.
import java.lang.S
public class ExtendsQtNative
public native void reportGpsInfo(int result, String content);
3.6&E:\work\c++\qt\QtAndroidGps\android\src\com\mtn\mes\GpsService.java
package com.mtn.
import java.lang.S
import android.content.C
import android.content.I
import android.app.PendingI
import android.os.H
import android.os.M
import android.util.L
import android.net.ConnectivityM
import android.net.NetworkI
import android.net.U
import android.location.C
import android.provider.S
import android.os.B
import android.os.E
import java.io.F
import com.loopj.android.http.AsyncHttpC
import com.loopj.android.http.AsyncHttpResponseH
import android.widget.T
import java.util.D
import android.location.L
import android.location.LocationL
import android.location.LocationM
import com.amap.api.location.AMapL
import com.amap.api.location.AMapLocationL
import com.amap.api.location.LocationManagerP
import com.amap.api.location.LocationProviderP
import com.baidu.location.BDL
import com.baidu.location.BDLocationL
import com.baidu.location.LocationC
import com.baidu.location.LocationClientO
import com.baidu.location.LocationClientOption.LocationM
public class GpsService extends org.qtproject.qt5.android.bindings.QtActivity
private static GpsService m_
private final static String TAG = &GpsService&;
private final static int MSG_STR_GPS_LOC = 0;
private final static int MSG_RPT_GPS_INF = 1;
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
private LocationManagerProxy aMapM
public GpsService(){
m_instance =
public static void calledByCpp() {
System.out.println(&[0]hello world!&);
Message msg = new Message();
msg.what = MSG_STR_GPS_LOC;
m_instance.handler.sendMessage(msg); // 消息触发,启动GPS定位
//m_instance.handler.sendEmptyMessage(0); // 消息触发,启动GPS定位
public static void calledByCpp(int arg0) {
System.out.println(&[1]hello world!&);
private void startAmap() {
aMapManager = LocationManagerProxy.getInstance(this);
* mAMapLocManager.setGpsEnable(false);
* 1.0.2版本新增方法,设置true表示混合定位中包含gps定位,false表示纯网络定位,默认是true Location
* API定位采用GPS和网络混合定位方式
* ,第一个参数是定位provider,第二个参数时间最短是2000毫秒,第三个参数距离间隔单位是米,第四个参数是定位监听者
aMapManager.requestLocationUpdates(LocationProviderProxy.AMapNetwork, 2000, 10, mAMapLocationListener);
private AMapLocationListener mAMapLocationListener = new AMapLocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {
public void onProviderEnabled(String provider) {
public void onProviderDisabled(String provider) {
public void onLocationChanged(Location location) {
public void onLocationChanged(AMapLocation location) {
if (location != null) {
Double geoLat = location.getLatitude();
Double geoLng = location.getLongitude();
String cityCode = &&;
String desc = &&;
Bundle locBundle = location.getExtras();
if (locBundle != null) {
cityCode = locBundle.getString(&citycode&);
desc = locBundle.getString(&desc&);
String str = (
&location ok:(& + geoLng + &,& + geoLat + &)&+
&\nAccuracy
:& + location.getAccuracy() + &Meter& +
&\nPositioning:& + location.getProvider() +
&\nPositioning time:& + new Date(location.getTime()).toLocaleString() +
&\nCity coding :& + cityCode +
&\nLocation Description:& + desc +
&\nProvince:& + location.getProvince() +
&\nCity:& + location.getCity() +
&\nDistrict (county):& + location.getDistrict() +
&\nRegional Coding:& + location.getAdCode());
//Toast.makeText(getApplicationContext(), &高德定位\n& + str, Toast.LENGTH_SHORT).show();
// 发送位置信息到handler, hander处再转发给Qt
Message msg = new Message();
Bundle data = new Bundle();
data.putString(&value&, str);
msg.setData(data);
msg.what = MSG_RPT_GPS_INF;
handler.sendMessage(msg);
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.what) {
case MSG_STR_GPS_LOC: // 消息类型为启动GPS定位
m_instance.startAmap();
case MSG_RPT_GPS_INF: // 消息类型为上送GSP信息
ExtendsQtNative
m_nativeNotify = new ExtendsQtNative();
Bundle data = msg.getData();
System.out.println(data.getString(&value&));
m_nativeNotify.reportGpsInfo(0, data.getString(&value&)); // 掉用c++方法
System.out.println(&msg type error!&);
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:&&&&&&&&&原文地址:http://blog.csdn.net/lihancheng/article/details/
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!

我要回帖

更多关于 android的se状态 的文章

 

随机推荐