2015-12-01 94 views
0

背景

我有一個日記應用程序,允許用戶將照片附加到來自相機或存儲的條目。該應用程序以內容的形式在數據庫中存儲對圖像文件的引用:// Uri字符串。這似乎可靠地工作。是否可以請求讀取特定內容的Uri?

現在我想創建一個更基本的應用程序的免費版本,但我需要包括一個機制,以便將數據導入更高級的應用程序,如果用戶選擇升級。這很容易用導出的ContentProvider完成,但是嘗試從內容中讀取Uris結果的SecurityException,因爲它是一個不同的應用程序。

問題

是否可以請求對已知Uri的持久讀訪問?我知道如何使用由ACTION_OPEN_DOCUMENT返回的Uri上的takePersistableUriPermission意圖,但我沒有看到用特定的Uri做到這一點的方法。

可能的解決方案

  1. 使用一個單一的應用程序與應用程序內購買解鎖的全部功能。我想避免的原因是它依賴於Google Play,並且免費版本的文件大小將會不必要的大。
  2. 對於這兩個應用程序使用相同的sharedUserId,因此他們的權限是共享的。在這種情況下這是不可能的,因爲現有用戶將無法升級。
  3. content:// Uris轉換爲file:// Uris,並在接收應用程序中創建一個新的內容Uri。當然,這對於所有內容Uris來說都是不可能的,但它總比沒有好。
+0

「是否可以請求對已知Uri的持久讀訪問?」 - 爲什麼你需要它堅持下去?進口通常是一次性的事情。 – CommonsWare

+0

應用程序需要能夠在每次查看條目時閱讀內容,而不僅僅是在導入期間。 –

回答

1

簡短的回答我的問題似乎是否定的。

據我可以告訴從文檔看來,你必須提供內容提供程序使用takePersistableUriPermission持續的Uri權限由ACTION_OPEN_DOCUMENT意圖返回的數據。似乎沒有辦法提出訪問特定Uri的權限請求。

爲解決此問題,我決定將內容Uris視爲易失性內容,並將數據複製到外部存儲上的公用應用程序特定目錄中的文件中。然後,我只需要存儲文件名並在需要時重新構建完整路徑。這使得數據庫不可知的文件結構和數據更便攜。缺點是它複製數據並使用更多的存儲空間。

0

我認爲你必須實現1號 你可以做幾個版本的「口味」搖籃: 沒什麼複雜的: 建設付出了味道(白衣全部)。 建立一個免費的味道(較小)。

productFlavors { 
paid { 
    applicationId = "com.vogella.android.gradlebuildflavors.paid" 
    versionName = "1.0-paid" 
} 

free { 
    applicationId = "com.vogella.android.gradlebuildflavors.free" 
    versionName = "1.0-free" 
} 
} 

一個教程:

http://www.vogella.com/tutorials/AndroidBuild/article.html

+0

這就是你如何創建兩個獨立的應用程序共享一些共同的代碼,這正是我已經做了。它們仍被視爲兩個不同的應用程序,應用程序內購買將不能升級免費版本,除非它包含所有代碼。 –

相關問題