如何在android中读取另一个应用程序数据库

时间:2017-06-04 11:19:05

标签: java android sqlite

我需要从我的应用程序中读取另一个应用程序的sqlite数据库。我知道默认情况下这在Android应用程序中是不可能的,但是因为设备是root的,我想我应该能够为我的应用程序提供root访问权限并抓住其他应用程序的数据库并阅读它。

我不希望设备用户收到通知并授予我SUPER_ACCESS权限,因此这应该是一个匿名过程。另一个App已经实现了ContentProvider并设置了exported = true

这是我到目前为止所尝试过的,但它仍然抛出一个异常,它无法打开数据库文件。

try {

    File dbFile = new File("/data/data/com.sam.sample/databases/sample.db");

    if(dbFile.exists()) {

        String [] cmd = {"su", "-c", "chmod", "777", file.getPath()};

        Process process = new ProcessBuilder(cmd).start();
        process.waitFor();

        SQLiteDatabase db = SQLiteDatabase.openDatabase(dbFile.getPath(), null, SQLiteDatabase.OPEN_READONLY);

        Cursor cursor = db.rawQuery("SELECT * FROM sample", null);

        if (cursor.moveToFirst()) {
            while (!cursor.isAfterLast()) {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                    Log.v("FROM DATABASE", name);
                    cursor.moveToNext();
                }
            }
        }

        cursor.close();
        db.close();

    }
}
catch(IOException e) {
   ...
}

我在这里做错了什么或者我应该做些什么?

1 个答案:

答案 0 :(得分:2)

要从其他应用程序数据库中读取数据,其他应用程序必须实现ContentProvider并将ContentProvider定义为exported = true

有关内容提供商的详细信息,请查看this

然后,要访问ContentProvider数据,您应该实现ContentResolver而不是尝试直接访问其他数据库。

有关内容接收器的更多信息,请查看this