请求Android应用程序的root访问权限

时间:2013-02-15 12:39:22

标签: android

我知道这里已有问题,但我尝试了所有答案都没有成功。

有一个简单的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 binary 3.1.1(最新版本)运行Superuser 3.1.3。

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

1 个答案:

答案 0 :(得分:3)

您正在运行的命令只是su,我怀疑它将以超级用户身份运行shell。你正在等待(无限期地)完成那个shell。

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

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