當涉及到權限時,我的一個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>
你終於明白了嗎?我正在尋找非常相似的東西。需要有選擇地將Internet權限添加到沒有SharedUserId的現有應用程序... – Kanchu 2016-03-01 17:30:39