我知道这里已有问题,但我尝试了所有答案都没有成功。
有一个简单的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}
答案 0 :(得分:3)
您正在运行的命令只是su
,我怀疑它将以超级用户身份运行shell。你正在等待(无限期地)完成那个shell。
您需要指定su some-command-here-which-needs-to-run-as-root
。
不幸的是,没有办法在Android项目中获得Java代码的超级用户权限。 root-ness仅适用于由su
本身生成的命令。