2010-11-30 46 views
7

這兩個應用程序具有相同的sharedUserId。當我在app1中使用此代碼時將私人訪問文件寫入其他應用程序的文件目錄

context.openFileOutput("/data/data/org.me.app2/files/shared-data.dat", MODE_PRIVATE) 

我得到一個異常,告訴我該文件包含路徑分隔符。

我想從app1寫入文件到app2的存儲。 (我當然需要確保App2的文件目錄第一存在)

理想情況下,我會寫一個用戶特定的目錄,而不是一個應用程序特定的目錄,但我不知道是否可以做

回答

6

首先,不要使用像/data/data這樣的內部存儲的完整路徑。讓操作系統爲您提供路徑(例如,通過Context.getFilesDir()Environment.getExternalStorageState())。不要假設數據在哪裏。

其次 - 你已經這麼做了!與File不同,Context.openFileOutput已經將/data/data/[package]加到您的路徑中,因此您無需指定該路徑。只需指定文件名稱即可。

如果你真的認爲它是安全的和必要的,如果這兩個應用程序使用的android共享相同的用戶ID:在清單sharedUserId,您可以通過使用Context.createPackageContext()得到其他應用程序的情況下,用CONTEXT_RESTRICTED,然後用openFileOutput只有文件名。

+1

但我怎麼說app1應該寫一個文件到app2? – 2010-11-30 21:23:06

+1

這通常是不鼓勵的。你不應該寫入另一個應用程序的私人存儲! MODE_PRIVATE特別不會讓你變得很好 - 數據甚至不會被其他應用程序讀取!如果你確實需要使用`File`來指定一個絕對路徑。但這聽起來像是你開始時使用了錯誤的方法。 – EboMike 2010-11-30 21:24:51

+1

首先(我認爲)MODE_PRIVATE會工作,因爲我使用相同的sharedUserId。其次,我打算將共享數據寫入這兩個應用程序。未知應用無法訪問共享數據很重要。 – 2010-11-30 21:28:11

2

您不應該覆蓋其他應用程序文件。這就是說你有兩個解決方案

  1. 使用公共外部存儲(如SD卡)在應用程序之間共享文件。
  2. 如果其他應用程序不是你的,那麼你不能寫入它的/ data目錄,沒有root的。任何使用root的都可能,只是不要指望你的用戶都擁有root權限。

編輯:開發者同時擁有應用

感謝羅馬Kurik指出了這一點。他的帖子的鏈接上SO

從Android docs

安卓sharedUserId

將 與其他應用程序共享一個Linux用戶ID的名稱。默認情況下,Android爲每個 應用程序分配其自己的唯一用戶ID。 但是,如果此屬性設置爲 兩個或多個應用程序的相同值,它們將全部共享 相同的ID - 前提是它們也由 由相同證書籤名。 具有相同用戶ID的應用程序可以使用 訪問彼此的數據,並且如果需要 ,則可以在相同的過程中運行。

因此,這正是用戶ID在Linux中的工作方式,基本上你是兩者的擁有者,並且都具有讀/寫訪問權限。

5

打開所需要的文件的FileOutputStream,相對於這個路徑:

String filePath = getPackageManager(). 
    getPackageInfo("com.your2ndApp.package", 0). 
    applicationInfo.dataDir; 
5

由於這是個老我假設你已經解決了你的問題,但無論如何,我會做出貢獻。

在應用程序之間共享數據是ContentProviders的用途。假設您知道如何編寫ContentProvider並訪問它,可以通過ParcelFileDescriptor訪問文件,ParcelFileDescriptor包含創建文件的模式的常量。

您現在需要的是限制訪問權限,以便不是每個人都可以通過內容提供者讀取文件,而是通過android權限執行此操作。在一個你的應用程序的清單,一個將主機上的文件和內容提供商,寫的是這樣的:使用的ProtectionLevel =

<uses-permission android:name="com.example.android.provider.ACCESS" /> 

<permission android:name="com.example.android.provider.ACCESS" android:protectionLevel="signature"/> 

,並在這兩個應用程序添加此「簽名」,只有您簽名的應用才能訪問您的內容提供商,從而訪問您的文件。

相關問題