【问题标题】:Desktop application interacting with an android device与安卓设备交互的桌面应用程序
【发布时间】:2013-11-30 16:44:55
【问题描述】:

我正在构建一个 UI 应用程序 (.exe) 以在 Windows 主机上运行,​​它应该能够

  1. 列出已连接的安卓设备。
  2. 在内存(不是 sdcard)上写入一个 512 字节的文件。要从 UI 输入的写入路径。

要写入的文件在内部存储器上必须正好是 512 字节,这对我的应用程序需求至关重要。这是我的接近方式:

  1. 我使用 Qt 编写了 UI 和基本逻辑。
  2. 应用程序使用 adb devices 枚举连接的设备并显示在 UI 的 listView 中。
  3. 要写入文件,我首先在磁盘(我的电脑)上创建一个文件,用 512 字节(我预先配置的内容)填充它,然后使用 adb 将此文件推送到设备上

    int DoWrite(Buffer* pBuf)
    {
    // pBuf contains preconfigured 512 byte pattern to be written to a file on device
    //prepare a local file       
    char*cmdBuf = new char[512];
    for (int i(0); i < 512; ++i)
        cmdBuf[i] = pBuf->operator[](i);
    ofstream myFormattedFile;
    if(myFormattedFile.is_open())
    {
         //temp file creation successful
         pBuf->WriteFormattedDataToStream(myFormattedFile);
         myFormattedFile.close();
    }
    FILE* fp = 0;
    fp = fopen("rawData.bin", "wb");
    int temp = fwrite(cmdBuf, sizeof(char), 512, fp);
    fclose(fp);
    //push this file to device at /mnt/emmc/diagnose (or whatever the myFilePath is set to)
    //ADB_PATH is set to adb executable
    //m_filePath is set to /mnt/emmc
    std::string cmd = ADB_PATH + "adb push " + "C:\\Users\\MyUser\\DiagTool\\rawData.bin " + m_filePath;
    //Execute push command
    int rc = system(cmd.c_str());
    delete [] cmdBuf;
    return 0;
    }
    

我可以看到文件 /mnt/emmc/diagnose 已创建。 获取 adb shell,并在 /mnt/emmc 上执行 ls -l 确实显示文件大小为 512!

所以,这是我的问题:

  • 我在本地创建的文件显示以下属性

是不是我在磁盘上创建的文件实际上不是 512 字节,而是 4KB?

那么,如果我使用 adb push,在设备上创建的文件大小是多少? 512 字节还是因为它通过操作系统,它会应用适当的填充,实际文件大小不会是 512 字节?

  • 这是写入内部存储器的正确方法吗?还是有更好的方法?

  • 我不喜欢在设备上安装任何 .apk,并使用我的应用程序与之交互。但如果没有任何效果,我也可以采用这种方法!

感谢任何帮助或指针...

【问题讨论】:

    标签: android c++ file-io usb filesize


    【解决方案1】:

    我认为你在做正确的事情。

    1) 文件大小不应该改变,因为它是同一个文件。也许文件系统中的大小无论如何都不会相同。您可以尝试将其写入并读回,看看它是否确实发生了变化。

    2) 如果您不在设备上运行任何应用程序,adb 是您的最佳选择。

    3) 如果它是这样工作的,就让它保持原样。

    【讨论】:

    • 我需要文件系统的大小正好是 512 字节。我怎么能控制它?如果我直接在设备上运行应用程序,我可以发出 JNI 调用,例如JNIEXPORT jint JNICALL Java_com_NativeLib_writeCommand (JNIEnv * env, jobject obj,jstring path) { char const* path1 = (*env)->GetStringUTFChars(env,path,0);国际温度=0; int f = open(path1, O_CREAT | O_WRONLY |O_DIRECT);临时=写(f,cmdbuf,512);关闭(f);返回温度; }
    • 也许你可以通过 adb 使用 shell 命令。见stackoverflow.com/questions/9421010/using-du-on-android
    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多