【QT】Qt中ADB的使用

一、使用场景

        在Windows中需要控制安卓设备,在命令行操作不方便,集成在一个应用程序中

二、ADB类

为了方便,写了一个ADB类,通过这个类方法来实现adb的各个命令

完整源码

adb.h

#ifndef ADB_H
#define ADB_H

#include <QObject>
#include <QProcess>

// ADB 类继承自 QObject,用于处理 ADB 相关操作
class ADB : public QObject
{
    Q_OBJECT
public:
    // 构造函数和析构函数
    explicit ADB(QObject *parent = nullptr);
    ~ADB();

    // 方法声明:启动 ADB shell,获取 root 权限,执行 shell 命令,
    // 执行 ADB 命令,停止应用程序,退出 shell
    void startShell();
    void root();
    void executeShellCommand(const QString &command);
    void executeADBCommand();
    void executeStop();
    void exitShell();

signals:
    // 信号:命令输出,命令错误,root 完成
    void commandOutput(const QString &output);
    void commandError(const QString &error);
    void rootCompleted(); // root 完成信号

private slots:
    // 私有槽函数:读取标准输出和标准错误
    void readProcessOutput();
    void readProcessError();

private:
    QProcess *process; // QProcess 对象,用于处理进程
};

#endif // ADB_H

        

adb.c

#include "adb.h"
#include <QDebug>

// 构造函数:初始化 QProcess 对象,并连接信号和槽
ADB::ADB(QObject *parent) : QObject(parent)
{
    process = new QProcess(this);
    connect(process, &QProcess::readyReadStandardOutput, this, &ADB::readProcessOutput);
    connect(process, &QProcess::readyReadStandardError, this, &ADB::readProcessError);
}

// 析构函数:删除 QProcess 对象
ADB::~ADB()
{
    delete process;
}

// 启动 ADB shell
void ADB::startShell()
{
    process->start("adb", QStringList() << "shell");
}

// 获取 root 权限
void ADB::root()
{
    process->start("adb", QStringList() << "root");
}

// 退出 ADB shell
void ADB::exitShell()
{
    if (process->state() == QProcess::Running) {
        executeShellCommand("exit");
    } else {
        qDebug() << "ADB shell is not running.";
    }
}

// 执行 shell 命令
void ADB::executeShellCommand(const QString &command)
{
    if (process->state() == QProcess::Running) {
        process->write(command.toUtf8() + "\n");
    } else {
        qDebug() << "ADB shell is not running.";
    }
}

// 读取标准输出并发射信号
void ADB::readProcessOutput()
{
    QString output = process->readAllStandardOutput();
    emit commandOutput(output);

    // 检查输出以确定 root 命令是否成功
    if (output.contains("restarting adbd as root")) {
        emit rootCompleted();
    }
}

// 读取标准错误并发射信号
void ADB::readProcessError()
{
    QString error = process->readAllStandardError();
    emit commandError(error);
}

// 执行 ADB 命令以启动应用程序
void ADB::executeADBCommand()
{
    // 设置命令和参数
    process->setProgram("adb");
    process->setArguments(QStringList() << "shell" << "am" << "start" << "-n" << "com.zhx.camera_zhx/.MainActivity");

    // 启动进程
    process->start();
}

// 停止应用程序
void ADB::executeStop()
{
    if (process->state() == QProcess::Running) {
        process->terminate();
        process->waitForFinished();
    }
    QStringList arguments;
    arguments << "shell" << "am force-stop" << "com.zhx.camera_zhx";
    process->start("adb", arguments);
}

三、在 Qt 中使用 ADB

  • 创建 ADB 对象:在你的主窗口或其他类中创建 ADB 对象。

    ADB *adb = new ADB(this);
  • 启动 ADB shell:调用 startShell() 方法

    adb->startShell();
  • 获取 root 权限:调用 root() 方法。

    adb->root(); 
  • 执行 shell 命令:调用 executeShellCommand() 方法。

    adb->executeShellCommand("ls");
  • 执行 ADB 命令以启动应用程序:调用 executeADBCommand() 方法。

    adb->executeADBCommand(); 

  • 停止应用程序:调用 executeStop() 方法。

    adb->executeStop(); 

  • 退出 ADB shell:调用 exitShell() 方法。

    adb->exitShell();

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值