通过启用自定义权限两款Android应用程序之间的通信(Enable communication b

2019-09-20 18:42发布

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

Answer 1:

这是不是意味着该应用程序不能再访问自己的数据?

正确。

我已经添加了以下权限

我会倾permission-group ,因为这不应该是必要的。

此外,这两个清单文件现在得到这部分

只有一个叫您IntentService可能需要这一点。

如果没有这个做的工作,这样我可以从我的主要的应用程序通过这个代码中调用该插件的IntentService?

若该IntentService不出口。 请确保您的IntentService要么有一个<intent-filter>android:exported="true" 。 我建议去了<intent-filter>路线,所以你可以声明和使用自定义操作字符串,所以你从客户端应用程序硬编码的包和类的名称了。

下面是两个示例项目目录使用这种基本的方法,虽然在我的情况下,通信是基于安全ContentProvider ,而不是一个安全的IntentService 。 这个概念是一样的,虽然,所以这些小的调整,我希望你在做什么工作得很好。



文章来源: Enable communication between two Android apps via custom permissions