【发布时间】: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 有很多很棒的信息,请考虑阅读有关它包含的内容以及如何阅读它的教程。以后会对你有很大的帮助。