我知道这里已经有关于这个的问题,但我尝试了所有给出的答案,但没有成功。
有一个简单的 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}