2012-08-03 41 views
4

當涉及到權限時,我的一個Android應用程序需要某些「危險」功能。他們需要一些權限,比如「互聯網訪問」,這些權限與私人數據結合起來至關重要。通過自定義權限啓用兩個Android應用程序之間的通信

這就是爲什麼我要創建一個單獨的「附件」,即提供這些權限關鍵功能的第二個應用程序。因此,如果用戶需要他們,他們可以安裝附加組件,但主應用程序仍然可以在沒有這些權限的情況下運行。

使用sharedUserId顯然是最簡單的解決方案,但在此後添加此功能時,如果大量用戶已經使用該應用程序,可能會導致嚴重問題。這是否意味着應用程序無法再訪問自己的數據?

所以我必須選擇另一種方法。 ContentProviders是我儘量避免的,因爲在我看來,它們對於這個簡單的需求來說太複雜了。

我認爲自定義權限可以解決問題。他們可以嗎?我已經添加了以下權限聲明兩個主要的應用程序,以及附加上作爲一個孩子的manifest標籤中AndroidManifest.xml

<permission 
    android:name="com.my.package.ADDON" 
    android:label="@string/permission_title" 
    android:description="@string/permission_description" 
    android:permissionGroup="android.permission-group.PERSONAL_INFO" 
    android:protectionLevel="signature" /> 

此外,兩個清單文件已經得到了這部分現在:

<uses-permission android:name="com.my.package.ADDON"></uses-permission> 

的附加應用包括現已以下屬性的IntentService

android:permission="com.my.package.ADDON" 

不應該這樣做的工作,這樣我可以通過此代碼從我的主應用程序中調用附加程序的IntentService

Intent addonIntent = new Intent(); 
addonIntent.setClassName("com.my.package", "com.my.package.MyService"); 
startService(addonIntent); 

不幸的是,這個調用總是失敗,但下列情況除外:

E/AndroidRuntime(16721): java.lang.SecurityException: Not allowed to start service Intent { cmp=com.mypackage.addon/.MyService } without permission com.mypackage.permission.ADDON 

我做了什麼錯?非常感謝您提前!

加#1 - 附加清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     android:versionCode="1" 
     android:versionName="1.0" 
     package="com.mypackage.addon"> 
    <uses-sdk android:minSdkVersion="8" /> 
    <permission 
     android:name="com.mypackage.permission.ADDON" 
     android:label="@string/permission_title" 
     android:description="@string/permission_description" 
     android:permissionGroup="android.permission-group.PERSONAL_INFO" 
     android:protectionLevel="signature" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:permission="com.mypackage.permission.ADDON" 
    android:exported="true"> 
    <service 
     android:enabled="true" 
     android:name=".MyService" /> 
</application> 
</manifest> 

加#2 - 主要的應用程序清單:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     android:versionCode="1" 
     android:versionName="1.0" 
     package="com.mypackage.mainapp"> 
    <uses-sdk android:minSdkVersion="8" /> 
    <permission 
     android:name="com.mypackage.permission.ADDON" 
     android:label="@string/permission_title" 
     android:description="@string/permission_description" 
     android:permissionGroup="android.permission-group.PERSONAL_INFO" 
     android:protectionLevel="signature" /> 
    <uses-permission android:name="com.mypackage.permission.ADDON"></uses-permission> 
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name="MyApp"> 
    <activity android:name=".MainActivity" android:launchMode="singleTask" android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 
</manifest> 
+0

你終於明白了嗎?我正在尋找非常相似的東西。需要有選擇地將Internet權限添加到沒有SharedUserId的現有應用程序... – Kanchu 2016-03-01 17:30:39

回答

5

這是不是意味着應用程序可以不再使用自己的數據了嗎?

正確。

我已經添加了以下權限

我會傾permission-group,因爲這不應該是必要的。

此外,兩個清單文件已經得到了這部分現在

只有一個打電話給你IntentService可能需要這一點。

不應該這樣做的工作,以便我可以通過此代碼從我的主應用程序調用附加的IntentService?

如果沒有導出IntentService,則不會。確保您的IntentService有一個<intent-filter>android:exported="true"。我建議去<intent-filter>路由,所以你可以聲明和使用一個自定義的動作字符串,這樣你就可以遠離在客戶端應用中對硬件包和類名稱的硬編碼。

Here is a directory with two sample projects使用這種基本方法,但在我的情況下,通信是基於安全的ContentProvider而不是安全的IntentService。雖然這個概念是相同的,所以通過這些小的調整,我會期待你正在做的工作很好。

+0

謝謝!我沒有設置android:exported =「true」的原因是Eclipse說:導出的服務不需要權限。所以我認爲主應用需要權限,然後在加載項的服務被導出時。真正? – caw 2012-08-03 17:44:57

+0

@MarcoW .:「所以我認爲主應用程序需要權限,然後在加載項服務導出時才需要權限。」True?「 - 正確。但是,附加組件不需要'',只需要''和'android:permission'。 – CommonsWare 2012-08-03 17:49:26

+0

是的,但我想要在兩個方向上進行溝通,我只是在這裏留下了。如果主應用程序需要權限,則附加組件不再有用,因爲我想「外包」權限關鍵功能。所以我唯一的機會是在主應用程序和附加組件中使用相同的'sharedUserId',對嗎? – caw 2012-08-03 18:26:12

相關問題