【问题标题】:Programatically check if su can run, if not, setcontentview?以编程方式检查 su 是否可以运行,如果不能,setcontentview?
【发布时间】:2014-07-24 21:59:20
【问题描述】:

好的,我在这里很困惑。我是 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。如果没有植根,setContentView 到不同的布局。我什么都想不通!从字面上看,没有任何效果。

我有一个名为isRooted() 的方法,它检查/system/xbin 中是否存在su。但我不知道如何将其合并到我的 if/else 语句中。我希望它在发生其他任何事情之前检查根,如果找不到根,只需切换血腥布局即可。但是由于 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 包装在另一个检查 root 的 if/else 中?我想另一件事是,我怎么称呼isRooted()?我认为我做错了:

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

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

Logcat 输出显示 NullPointerException 发生在我的 onCreate 中,我认为这直接是由于 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)

【问题讨论】:

  • “Logcat 输出显示 NullPointerException 发生在我的 onCreate 中”——堆栈跟踪应将您指向代码中触发异常的确切行。
  • 我想我不知道在哪里可以找到它。我在编辑中发布了我的 LogCat 输出。
  • 它发生在MainActivity.java 的第 126 行,正如您在问题中所拥有的堆栈跟踪部分的底行所指出的那样。
  • ...哇,好吧,我只需要你们指出这些数字到底意味着什么。第 126 行是 textView.setTextSize,它只出现在第一个布局中。它在if isRooted()) 之外,因此即使设备 植根(因此发生布局更改),我仍在更改字体大小...** 不存在的文本视图**。我只是把它放在if isRooted()) 里面。谢谢大家,现在一切正常!
  • 很高兴听到。 Logcat 有很多很棒的信息,请考虑阅读有关它包含的内容以及如何阅读它的教程。以后会对你有很大的帮助。

标签: java android root


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2011-01-31
    • 2012-12-31
    • 2013-06-29
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多