1

ここでそれについてすでに質問があることは知っていますが、与えられたすべての回答を試してみましたが、成功しませんでした。

シンプルな 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}

4

1 に答える 1

3

su実行しているコマンドは、スーパーユーザーとしてシェルを実行するコマンドです。そのシェルが終了するのを(無期限に)待っています。

を指定する必要がありますsu some-command-here-which-needs-to-run-as-root

残念ながら、Androidプロジェクト内でJavaコードのスーパーユーザー権限を取得する方法はありません。ルートネスは、suそれ自体で生成されるコマンドにのみ適用されます。

于 2013-02-15T13:50:38.620 に答える