【问题标题】:android : how to run a shell command from within codeandroid:如何在代码中运行 shell 命令
【发布时间】:2011-03-04 13:19:30
【问题描述】:

我正在尝试从我的代码中执行一个命令, 命令是“echo 125 > /sys/devices/platform/flashlight.0/leds/flashlight/brightness” 我可以从 adb shell 毫无问题地运行它

我正在使用 Runtime 类来执行它:

Runtime.getRuntime().exec("echo 125 > /sys/devices/platform/flashlight.0/leds/flashlight/brightness");

但是我得到一个权限错误,因为我不应该访问 sys 目录。 我还尝试将命令放在 String[] 中,以防空格引起问题,但并没有太大区别。

有没有人知道任何解决方法?

【问题讨论】:

    标签: android shell command


    【解决方案1】:

    手机需要root,之后你可以这样做:

    public static void doCmds(List<String> cmds) throws Exception {
        Process process = Runtime.getRuntime().exec("su");
        DataOutputStream os = new DataOutputStream(process.getOutputStream());
    
        for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd+"\n");
        }
    
        os.writeBytes("exit\n");
        os.flush();
        os.close();
    
        process.waitFor();
    }    
    

    【讨论】:

    • 我已经在我的非路由设备上尝试过了,但没有按预期工作。但是我觉得我可能在这里遗漏了一些东西,因为我可以成功地从 adb shell 执行命令,并且我找到了以某种方式打开 LED 的软件。谢谢你的回答。
    • 这仅适用于有根设备。当您从 PC 使用 ADB 时,您拥有比在设备上运行的应用程序更大的权限(与在安全设备上不同的是,在模拟器上,ADB 实际上可以以 root 身份运行命令)。 Android 经过专门设计不允许应用程序执行具有系统范围影响的命令。人们使用 root shims 破解他们的设备的原因是通过该安全模型钻一个大洞 - 一个不应该存在于库存设备上的洞。
    【解决方案2】:

    如果您只是想设置亮度,为什么不通过provided API 进行设置(AKA,您尝试按自己的方式设置亮度有什么原因吗)。

    int brightness = 125; 
    Settings.System.putInt(
          ftaContext.getContentResolver(), 
          Settings.System.SCREEN_BRIGHTNESS, 
          brightness); 
    

    【讨论】:

    • 我关心的不是屏幕亮度,而是相机镜头旁边的闪光灯。相机设置中有一个 FLASH_MODE_TORCH 属性,该属性不受期望的支持(我尝试时并没有做太多),但显然我已经看到能够做到这一点的软件,所以我想有一个解决方法。谢谢
    • @ee3509 - 啊,我的错。我只是看到“亮度”作为最后一个参数,并没有看到路径的手电筒部分。
    【解决方案3】:

    同意您可能需要 root 手机才能写入系统文件。我很惊讶亮度没有通过 SDK 暴露。

    有关从代码运行 shell 命令的详细信息,check out 这个项目:

    【讨论】:

    • 感谢您的评论,这是我正在使用的方法,但我仍然收到权限错误。当我尝试从 adb shell 发送相同的命令时,该命令会正确执行,这让我认为可能没有必要拥有一个 root 手机 - 但不确定。
    • 我的手机上不存在该文件/设备。 flashlight.0 目录是通过什么方式产生的?我使用adb shell 搜索,发现我可以cd 一直到/sys/devices/platform,但我没有任何名为 flashlight.0 的文件。此外,该目录中的所有内容都归 root 拥有,模式为 755,这意味着只有 root 可以写入文件。此权限似乎适用于 /sys 下的所有内容,因此如果您的 flashlight.0/leds/flashlight/brightness 确实存在,并且由 root 拥有,并且具有模式 755 权限 (drwxr-xr-x),那么您必须拥有 root。
    • 我正在使用 HTC Desire 并且文件在那里,我也成功地从 adb shell 执行了命令(背面的 LED 将打开),而没有植根我的设备。亮度的权限是 (-rw-rw-rw-)
    【解决方案4】:

    adb shell 可以在没有 root 设备的情况下充当超级用户。 这是一个调试桥。你可以通过它为所欲为。

    但是,当您调用 Runtime.getRuntime().exec 时,您没有相同的权限。某些 shell 命令甚至无法从 exec 中获得。

    因此,您不仅需要root设备,还需要su premmisions。

    【讨论】:

    • 即使使用 adb shell,您也没有设备上的 root/超级用户访问权限,尽管您的访问权限比普通应用多一点。
    【解决方案5】:

    您也可以移除 /system 并获得写入权限..

    【讨论】:

      【解决方案6】:

      我认为设备需要“root”才能正常工作。在google上搜索一下,看看其他开发者是怎么做到的,手电筒应用是不缺的。

      【讨论】:

      • 我只看到一个应用可以打开我的Desire上的flash led,我没有它的shource代码,还在等待开发者给我一个提示。感谢您的回答
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 2010-10-29
      相关资源
      最近更新 更多