Android权限 - 最佳做法

时间:2014-01-26 15:22:04

标签: android android-permissions

我有两个Android应用程序,一个权限提供程序和一个请求程序。

提供商具有以下清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.permissionprovider"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />

<permission android:description="@string/permission_desc"
        android:icon="@drawable/ic_launcher"
        android:label="some permission"
        android:name="com.example.permissionprovider.CUSTOM"
        android:protectionLevel="normal" />
<!-- is the below tag required in the provider?--> 
<uses-permission android:name="com.example.permissionprovider.CUSTOM"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.permissionprovider.MainActivity"
        android:permission="com.example.permissionprovider.CUSTOM"
        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>
  1. 我希望为可启动活动设置权限是错误的,因为启动器无权启动此活动。这是正确的吗?

  2. 提供者的清单是否应声明提供者应用程序需要权限 - com.example.permissionprovider.CUSTOM,还是不需要,因为权限是在同一清单中定义的?

  3. 现在我有请求者应用程序,其中包含以下清单

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.permissionrequester"
    android:versionCode="1"
    android:versionName="1.0" >
    
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
    <uses-permission android:name="com.example.permissionprovider.CUSTOM"/>
    
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.permissionrequester.MainActivity"
            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>
    

    并且请求者尝试启动提供者的活动。

    Intent i;
        PackageManager manager = getPackageManager();
        try {
            i = manager.getLaunchIntentForPackage("com.example.permissionprovider");
            if (i == null)
                throw new PackageManager.NameNotFoundException();
            i.addCategory(Intent.CATEGORY_LAUNCHER);
            startActivity(i);
        } catch (PackageManager.NameNotFoundException e) {
    
        }    }
    
    1. 如果首先安装了提供者应用程序,然后是请求者,那么请求者将能够启动提供者的Activity,但如果它是首先安装的请求者,则不会发生这种情况。怎么解决这个问题?

1 个答案:

答案 0 :(得分:2)

  

我希望将权限设置为可启动活动是错误的,因为启动程序无权启动此活动。这是正确的吗?

正确,发射器将无法启动该活动。但是,它仍会出现在启动器中,因此当用户无法启动您的应用时,用户会感到沮丧。

  

提供者的清单是否应声明提供者应用程序需要权限 - com.example.permissionprovider.CUSTOM,还是不需要,因为权限是在同一清单中定义的?

您可以在两个应用中定义<permission>,以解决您的上一个问题:

  

如果首先安装了提供者应用程序,然后是请求者,那么请求者将能够启动提供者的Activity,但如果它是首先安装的请求者,则不会发生这种情况。怎么解决这个问题?

在两个应用中定义<permission>

此外,如果您要发布这两个应用,并且没有第三方使用您的提供商,请使用signature级权限,而不是normal - 一个。这将阻止除您之外的任何人编写可成功保留权限的应用程序。