1

我知道这里已经有关于这个的问题,但我尝试了所有给出的答案,但没有成功。

有一个简单的 CheckBoxPreference(标题为“Root”):

<CheckBoxPreference
    android:key="root"
    android:title="@string/root"
    android:summary="@string/root_summary"
    android:defaultValue="false" />

现在我需要在其上设置 OnPreferenceChangeListener 并获得 root 访问权限。如果是这样,则应选中该复选框,否则不应:

public class Settings extends PreferenceActivity implements OnPreferenceChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);

        findPreference("root").setOnPreferenceChangeListener(this);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        String key = preference.getKey();
        if ("root".equals(key) && !((CheckBoxPreference) preference).isChecked()) {
            try {
                Process p = Runtime.getRuntime().exec("su");
                p.waitFor();
                Log.d("Settings", Integer.toString(p.exitValue()));
                if (p.exitValue() == 255) {
                    Log.d("Settings", "###NO ROOT###");
                    return false;
                }
            } catch (Exception e) {
                Log.d("Settings", "###NO ROOT###");
                Log.d("Settings", e.getMessage());
                return false;
            }
            Log.d("Settings", "!!!ROOT!!!");
        }

        return true;
    }

}

超级用户正确提示 root 访问。然而,拒绝也返回 true,因为 exitValue 为 1 (???) 并允许冻结整个应用程序(我猜是 p.waitFor)。

我目前正在使用 su 二进制 3.1.1(最新版本)运行超级用户 3.1.3。

查看 logcat 我可以看到以下消息:Activity pause timeout for ActivityRecord{42c0ebb8 com.example/.gui.Settings}

4

1 回答 1

3

您正在运行的命令正是su我怀疑将以超级用户身份运行 shell 的命令。您正在(无限期地)等待该外壳完成。

您需要指定su some-command-here-which-needs-to-run-as-root.

不幸的是,没有办法在您的 Android 项目中获得 Java 代码的超级用户权限。root-ness 仅适用于自身产生的命令su

于 2013-02-15T13:50:38.620 回答