【Qt】Qt for Android创建AndroidManifest.xml调用java

用Qt编写跨平台的安卓程序虽然便捷,但也有很大的局限性,对手机硬件的开关读写等都需要调用原生的java接口,而Qt已经提供了c++调用java的JNI接口。
从网上搜了不少帖子,基本没有一个能用的,不知是否我操作有勿,毕竟从没接触过java。现通过阅读《Qt on Android核心编程》一书,并结合自己的实践,成功通过Qt编写安卓程序,调用java对手机的wifi进行操作。还是那句话,通道一旦打开,之后就是个人发挥了。

1.创建AndroidManifest.xml

在工程中点左侧的项目,展开Build Android APK,点击Create Templa,如下图
在这里插入图片描述
直接按默认路径点击确定,在你的工程目录下便多出了一个“其他文件夹”,其中有个android文件夹,AndroidManifest.xml便在这个android文件夹下,如下图。另外,android文件夹下,除了AndroidManifest.xml文件其余的都可以删掉,前提是不使用gradle。
在这里插入图片描述
双击AndroidManifest.xml,如下图。看到其默认package name为org.qtproject.example,记住这个package name,这个非常非常,非常重要。同时,因为我调用的是wifi接口,所以在下方的permissions中要添加相关权限,比如图中我添加的那几个。
在这里插入图片描述

2.按路径添加文件夹和java源文件

Qt的JNI调用的java源文件默认是要在src文件夹下的,而刚刚说的那个非常重要的package name,也就是org.qtproject.example正是java源文件在src文件夹中的路径。什么意思呢?就是说你要调用一个java源文件,那么这个源文件必须位于src/org/qtproject/example路径下,所以,我们在android文件夹下依次创建src、org、qtproject、example文件夹,并将java源文件放在这里,我的java源文件名字为ExtendsQtWithJava,所以我的文件夹结构如下图所示
在这里插入图片描述
java源码如下

package org.qtproject.example;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
import android.content.Context;

public class ExtendsQtWithJava extends org.qtproject.qt5.android.bindings.QtActivity
{
    private static ExtendsQtWithJava m_instance ;


    public ExtendsQtWithJava(){
        m_instance = this;
    }


    public static int getwifienable(){
        WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE);
        if(conMan.isWifiEnabled())
            return 1;
        else
            return 0;

    }

    public static void openWifi(){
        WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE);
        if(!conMan.isWifiEnabled()){
            conMan.setWifiEnabled(true);
        }
    }

    public static void closeWifi(){
        WifiManager conMan = (WifiManager) m_instance.getSystemService(Context.WIFI_SERVICE);
        if(conMan.isWifiEnabled()){
            conMan.setWifiEnabled(false);
        }
    }

    public static int networkEnable(){
        ConnectivityManager conMan = (ConnectivityManager)m_instance.getSystemService(Context.CONNECTIVITY_SERVICE);
        return conMan.getActiveNetworkInfo() == null ? 0:1;
    }

}

注意这个java源码的package name要和刚刚创建AndroidManifest.xml时的package name相同,也就是org.qtproject.example。在这个源文件中,定义了ExtendsQtWithJava类,继承于org.qtproject.qt5.android.bindings.QtActivity,其中实现了几个方法,分别是获得wifi状态、打开关闭wifi、获得网络状态,这些都是典型的java调用安卓设备的代码,想要什么网上都可以搜到。

3.在XML Source下配置AndroidManifest.xml

这一步非常重要,也正是网上各帖子没有讲明白的。打开AndroidManifest.xml,然后点击XML Source进入源码模式编辑AndroidManifest.xml,如下图
在这里插入图片描述
重点来了,网上所有帖子都说把android:name改成某某某,但并没有说实在哪个android:name后修改。我也是看了《Qt on Android核心编程》后才得知要修改的时activity后的android:name。
以源码模式打开AndroidManifest.xml后,我们能清楚的看到package为org.qtproject.example,然后找到activity元素,然后将其后边的android:name =“xxxxx”中的内容改为package name + java源码名字的格式。以本工程为例,就是改成android:name=“org.qtproject.example.ExtendsQtWithJava”
,如以下代码中的第四行。

<?xml version="1.0"?>
<manifest package="org.qtproject.example" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.0" android:versionCode="1" android:installLocation="auto">
    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="-- %%INSERT_APP_NAME%% --">
        <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.example.ExtendsQtWithJava" android:label="-- %%INSERT_APP_NAME%% --" android:screenOrientation="unspecified" android:launchMode="singleTop">

到此为止,在你的Qt c++程序中就可以调用ExtendsQtWithJava类中的方法了,也就是调用java。

4.在Qt中调用java

首先在pro文件中添加一行:QT += androidextras,并在需要调用java的cpp中包含以下头文件

#include <QtAndroid>
#include <QAndroidJniObject>
#include <QAndroidJniEnvironment>

现在就可以在c++中调用java了
添加了三个按钮和一个textEdit用来调试wifi状态和开关wifi,代码如下

void MainWindow::on_pushButton_clicked()
{
    int wifistate;
    wifistate = QAndroidJniObject::callStaticMethod<jint>("org/qtproject/example/ExtendsQtWithJava",
                                                          "getwifienable",
                                                          "()I");
    if(wifistate == 1)
    {
        ui->textEdit->append(tr("wifi is enable"));
    }
    else
    {
        ui->textEdit->append(tr("wifi is disable"));
    }
}


void MainWindow::on_pushButton_2_clicked()
{
    QAndroidJniObject::callStaticMethod<void>("org/qtproject/example/ExtendsQtWithJava",
                                        "openWifi");
    ui->textEdit->append(tr("wifi open"));
}


void MainWindow::on_pushButton_3_clicked()
{
    QAndroidJniObject::callStaticMethod<void>("org/qtproject/example/ExtendsQtWithJava",
                                        "closeWifi");
    ui->textEdit->append(tr("wifi closed"));
}

利用QAndroidJniObject::callStaticMethod来调用java源码中的方法。

QAndroidJniObject::callStaticMethod<jint>("org/qtproject/example/ExtendsQtWithJava",
                                                          "getwifienable",
                                                          "()I");

这里的是因为在java源码中getwifienable这个函数是返回int的,后边的三个参数:1.“org/qtproject/example/ExtendsQtWithJava”,源码路径;2. “getwifienable”,java方法;3. “()I”,java签名,因为次方法为无参数、返回int型的,所以此处的java签名为()I,具体java签名规则可以自行百度。

5.编译、安装、测试

连接手机后编译,程序在手机上按预期运行。即点击wifi state按钮能够获得手机当前wifi的打开、关闭状态,open wifi和close wifi也能按预期执行,测试正常,如下图。
在这里插入图片描述
在这里插入图片描述
工程源码:https://download.csdn.net/download/spiremoon/11962116

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: Qt for Android可以通过Qt Multimedia模块来调用安卓手机摄像头实现拍照和录像功能。 首先,需要在.pro文件中添加multimedia模块的引用,即将`QT += multimedia`添加到.pro文件中。 接下来,创建一个QCamera对象,可以使用默认摄像头或指定摄像头。通过调用`QCameraInfo::defaultCamera()`可以获取默认摄像头的信息,或者使用`QCameraInfo::availableCameras()`获取所有可用摄像头列表。然后,调用`setCaptureMode()`方法来设置摄像头的捕获模式,可以选择使用`QCamera::CaptureStillImage`来拍照,或使用`QCamera::CaptureVideo`来录制视频。 如果需要显示摄像头的即时预览画面,可以创建一个QCameraViewfinder对象,并将其设置为QCamera的视图finder,然后将QCameraViewfinder设置为显示在窗口上。可以使用QGraphicsView或QWidget来显示摄像头的预览画面。 在拍照时,可以使用QCameraCaptureSession或直接使用QCamera的capture()方法来捕获静态图像。捕获的图像可以使用QCameraImageCapture类获取,并保存到本地文件中。 在录制视频时,可以使用QMediaRecorder来进行视频录制,首先创建一个QMediaRecorder对象,并使用setMedia()方法设置录制的媒体文件名和格式。然后,设置视频编码器、分辨率、比特率等参数,并调用record()方法开始录制,调用stop()方法停止录制。 最后,记得在AndroidManifest.xml文件中添加相应的权限,例如访问相机、录音和存储等权限。 通过以上步骤,就可以在Qt for Android中成功调用手机摄像头实现拍照和录像功能了。 ### 回答2: 在Qt for Android开发中,要调用手机摄像头,可以使用Qt Multimedia模块中的QCamera类。 首先,需要在.pro文件中添加对Multimedia模块的依赖: ``` QT += multimedia ``` 然后,在代码中引入QCamera和QCameraViewfinder类: ``` #include <QCamera> #include <QCameraViewfinder> ``` 接下来,创建一个QCamera对象并设置使用后置摄像头: ``` QCamera* camera = new QCamera; camera->setCaptureMode(QCamera::CaptureStillImage); // 设置为拍照模式 camera->setCaptureMode(QCamera::CaptureVideo); // 设置为录像模式 QCameraViewfinder* viewfinder = new QCameraViewfinder; camera->setViewfinder(viewfinder); QList<QCameraInfo> cameras = QCameraInfo::availableCameras(); foreach (const QCameraInfo& cameraInfo, cameras) { if (cameraInfo.position() == QCamera::BackFace) { // 后置摄像头 camera->setCamera(cameraInfo); // 设置为后置摄像头 break; } } ``` 然后,可以在需要调用摄像头的地方,调用QCamera的相关方法,比如开始预览、拍照或录像: ``` camera->start(); camera->searchAndLock(); camera->unlock(); camera->searchAndCapture(); ``` 最后,需要在界面上显示摄像头预览画面,可以将QCameraViewfinder设置为QWidget的子控件,并将其显示出来: ``` QVBoxLayout* layout = new QVBoxLayout; layout->addWidget(viewfinder); setLayout(layout); ``` 以上就是利用Qt for Android调用手机摄像头的基本步骤,开发者可以根据实际需求,进一步对摄像头功能进行扩展和定制。 ### 回答3: 在Qt调用Android手机的摄像头可以通过Qt Multimedia模块来实现。首先,确保已经正确配置了Qt for Android开发环境,并在.pro文件中添加了对Qt Multimedia模块的依赖,类似于:QT += multimedia。 接下来,创建一个Qt Quick界面来显示摄像头捕获的图像。可以使用Camera类型的对象来控制摄像头,并将摄像头的图像显示在Qt Quick界面上。 具体的步骤如下: 1. 在Qt Creator中创建一个新的Qt Quick项目。 2. 在qml文件中添加一个Item,用于显示摄像头图像,例如: Item { id: cameraView width: 640 height: 480 visible: camera.available anchors.centerIn: parent } 3. 在C++代码中创建一个Camera对象并连接到cameraView的source属性上: QCamera *camera = new QCamera(this); camera->setViewfinder(cameraView); camera->start(); 4. 在AndroidManifest.xml文件中添加相机权限,例如: <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardware.camera"/> <uses-feature android:name="android.hardware.camera.autofocus"/> <uses-feature android:name="android.hardware.camera.flash"/> 5. 在运行项目之前,将生成的apk安装到Android手机上,并确保手机上有可用的摄像头。 通过以上步骤,你的Qt for Android应用程序现在可以调用Android手机的摄像头并显示捕获的图像了。你还可以通过QCameraViewfinderSettings类来更改摄像头的设置,例如分辨率、帧率等。除了显示图像,你还可以使用QCamera类提供的其他函数来控制摄像头的拍照、录像等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜老越

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值