我正在尝试访问另一个应用程序的数据库并将其内容打印到控制台(USING ROOT),但出于某种原因我收到了这样的回复:
E/[Error]: Error: incomplete SQL: ls
E/[Error]: exit
我真的不明白为什么会这样。我试图将我的语法放在转义引号中,我尝试了其他sqlite命令,但它似乎没有正常工作。
我可以使用ADB通过我的PC以相同的路径访问数据库并使用ADB打印内容,如果我按下应用程序中的按钮,它会要求我访问root权限,因此这些不是问题。
我愚蠢的代码:
的onCreate
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnCon = (Button)findViewById(R.id.button1);
btnCon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RunWithRoot("su shell -c sqlite3 \"data/data/app.package/databases/Database.db\" \"select * from messages;\"");
}
});
}
RunWithRoot
private void RunWithRoot(String textView) {
try {
String line;
Process process = Runtime.getRuntime().exec(textView);
OutputStream stdin = process.getOutputStream();
InputStream stderr = process.getErrorStream();
InputStream stdout = process.getInputStream();
stdin.write(("ls\n").getBytes());
stdin.write("exit\n".getBytes());
stdin.flush();
stdin.close();
BufferedReader br =
new BufferedReader(new InputStreamReader(stdout));
while ((line = br.readLine()) != null) {
Log.d("[Output]", line);
}
br.close();
br =
new BufferedReader(new InputStreamReader(stderr));
while ((line = br.readLine()) != null) {
Log.e("[Error]", line);
}
br.close();
process.waitFor();
process.destroy();
} catch (Exception ex) {
}
}
有人知道我做错了什么吗?我对Android开发很新,甚至更新root。如果有人能用这个把我拉向正确的方向,那将是非常感激的。
PS:这个应用程序仅供个人使用,所以我不需要检查是否有人有根,或者路径是否存在等等。我已经听过一些开发人员的想法担心嘿答案 0 :(得分:0)
我使用以下代码修复了它。
private void RunWithRoot(){
String line;
Process process = Runtime.getRuntime().exec("su shell");
OutputStream stdin = process.getOutputStream();
InputStream stderr = process.getErrorStream();
InputStream stdout = process.getInputStream();
stdin.write("su -c 'sqlite3 \"/data/data/app.pkge/databases/Database.db\" \"select * from messages;\"'\n".getBytes());
stdin.flush();
stdin.close();
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
while ((line = br.readLine()) != null) {
Log.d("[Output]", line);
}
br.close();
br = new BufferedReader(new InputStreamReader(stderr));
while ((line = br.readLine()) != null) {
Log.e("[Error]", line);
}
br.close();
process.waitFor();
process.destroy();
}
现在它正常工作!主要是感谢@ScaryWombat!