2014-01-26 204 views
0

我有兩個Android應用程序,一個權限提供者和一個請求者。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. 我希望這是錯誤的權限設置爲可啓動的活動爲發射器將沒有權限推出這款activity.Is正確的嗎?

  2. 提供者的清單是否應聲明提供者應用程序需要權限 - com.example.permissionprovider.CUSTOM,還是不需要,因爲權限是在同一個清單中定義的?

現在我有具有以下明顯

<?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. 如果提供的應用程序被安裝在前,後跟請求者,則請求者就能啓動供應商的活動,但如果它是首先被安裝在請求者,這不會發生。如何解決這個問題?

回答

2

我希望這是錯誤的權限設置爲可啓動的活動爲發射器將沒有權限推出這款activity.Is正確的嗎?

正確,啓動程序將無法啓動該活動。但是,它仍會出現在啓動器中,因此用戶在無法啓動應用程序時會感到沮喪。

提供程序的清單應該聲明提供程序應用程序需要權限 - com.example.permissionprovider.CUSTOM,還是不需要,因爲權限是在同一個清單中定義的?

您可以定義在這兩個應用的<permission>,對付你的最後一個問題:

如果安裝了供應商的應用程序首先隨後請求,則請求就可以啓動供應商活動,但如果它是首先安裝的請求者,則不會發生這種情況。如何解決這個問題?

在兩個應用程序中定義<permission>。此外,如果您要發佈這兩個應用程序,並且沒有第三方應該使用您的提供商,請使用signature級許可權,而不是normal-一。這會阻止除你之外的任何人編寫可成功保存許可的應用程序。

+0

非常感謝你:)。添加到兩個應用程序解決了最後一個問題。問題2我認爲我不太清楚。我希望只在請求者而不是在提供者中是必需的,除非請求者有一些被相同權限保護的組件並且提供者試圖激活該組件。 – coderplus