ここでそれについてすでに質問があることは知っていますが、与えられたすべての回答を試してみましたが、成功しませんでした。
シンプルな CheckBoxPreference (「ルート」というタイトル) があります。
<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;
}
}
スーパーユーザーはルート アクセスを正しく要求します。ただし、exitValue が 1 (???) であるため、拒否しても true が返され、許可するとアプリ全体がフリーズします (p.waitFor で推測します)。
現在、スーパーユーザー 3.1.3 と su バイナリ 3.1.1 (最新バージョン) を実行しています。
logcat を調べると、次のメッセージが表示されます。Activity pause timeout for ActivityRecord{42c0ebb8 com.example/.gui.Settings}