以编程方式检查su是否可以运行,如果没有,setcontentview?

时间:2014-07-24 13:04:12

标签: java android root

好的,我在这里感到困惑。我是Java / Android编程的新手,我自学,所以请耐心等待。

基本上,我的整个onCreate由一个巨大的if / else语句组成。我有几个方法可以检查设备上是否安装了各种应用程序,然后我有一个名为RunAsRoot的方法,它只是以su执行shell命令。这是完整的onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    CharSequence message = null;
    Button button = (Button) findViewById(R.id.button1);
    boolean installed = appInstalledOrNot("x");

    if(installed) {
        message = "whateverhere";
        button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                RunAsRoot(commands);
            }
        });
    }
    else {
        message = "whateverhere";
        button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "You don't have packagenamehere installed, sorry!", Toast.LENGTH_LONG).show();
            }
        });
    }   

    TextView textView = (TextView )findViewById(R.id.textView);
    textView.setTextSize(20);
    textView.setText(message);
}

整个过程非常基础......如果安装了包,那么很酷,请执行命令。如果它没有安装,太糟糕了,你就无法运行这些命令。而且效果很好。但这是我的问题...我想检查设备是否在应用程序的开头扎根。如果 已植根,请转到我在上面发布的if / else。如果 root,setContentView为不同的布局。我无法解决任何问题!从字面上看,没有任何工作。

我有一个名为isRooted()的方法,用于检查/system/xbin中是否存在su。但我无法弄清楚如何将其纳入我的if / else语句。我希望在发生任何其他事情之前检查root,如果找不到root,只需切换血腥布局即可。但是由于NullPointerException,一切都崩溃了。

以下是isRooted()

public boolean isRooted() {
    try {
        Process process = new ProcessBuilder()
            .command("/system/xbin/su")
            .redirectErrorStream(false)
            .start();
    } catch (IOException e) { 
        return true;
    }
    return false;
}

我想我只是对这里的去处感到困惑。我应该将我的整个if / else包装在另一个if / else检查root吗?我猜另一件事是,我如何致电isRooted()?我想我做错了:

if (isRooted()) {
    //everything here
}

else {
    setContentView(R.layout.notrooted);
}

Logcat输出显示我的onCreate中发生了NullPointerException,我认为这是由于if (isRooted())

关于我应该从哪里开始的任何建议?

TL; DR:我想检查一下我是否可以以root用户身份运行,如果可以的话,继续编程,如果我不能,则更改布局并停止。

编辑:以下是我退出LogCat的所有内容:

07-24 09:00:51.257: E/AndroidRuntime(16282): Process: com.test.app, PID: 16282
07-24 09:00:51.257: E/AndroidRuntime(16282): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.test.app/com.test.app.MainActivity}: java.lang.NullPointerException
07-24 09:00:51.257: E/AndroidRuntime(16282): at com.test.app.MainActivity.onCreate(MainActivity.java:126)

1 个答案:

答案 0 :(得分:0)

我遇到过在Android中运行su命令的问题。 这是我的问题: Working Directory : null environment when running Process.Builder on android

基本上我根据使用Process.Builder获得的输出,确定我是否具有root访问权限。您可以使用它来确定您是否具有root权限。