2017-06-04 130 views
0

我需要從我的應用程序讀取另一個應用程序的sqlite數據庫。我知道默認情況下,這在android應用程序中是不可能的,但是當設備被植入時,我認爲我應該能夠給予我的應用程序根權限並獲取其他應用程序的數據庫並讀取它。如何在Android中讀取另一個應用程序數據庫

我不希望設備用戶得到通知並給我SUPER_ACCESS權限,所以這應該是一個匿名過程。另一個應用程序已經實現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) { 
    ... 
} 

有什麼,我在這裏做錯了或我應該做不同?

+0

如果其他應用程序已經實現了內容提供商並將其導出,爲什麼不直接使用它 – banguru

回答

1

讀取來自其他應用程序數據庫中的數據,這是必要的其他應用程序實施了ContentProvider,並定義爲ContentProvider的exported = true

有關內容供應商的詳細信息,請this

然後,要訪問ContentProvider數據,您應該實現ContentResolver而不是直接訪問其他數據庫。

欲瞭解更多關於內容接收器的信息,請查看this

+0

感謝您的回覆。 ContentProvider已經在其他應用程序中設置爲exported = true,但我仍然面臨同樣的問題。 –

相關問題