我的一个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>