11

在Google Play上我的應用出現問題。我有一個免費的應用程序,它使用自定義權限。此權限允許訪問付費應用程序。這些付費應用充當「鑰匙」,並在免費應用中解鎖功能。基本上免費的應用程序將嘗試啓動其中一個付費應用程序的意圖。付費應用會做一些事情,並返回說免費應用是否應該解鎖功能。基於應用安裝訂單,Android自定義權限失敗

問題出現了基於應用程序的安裝順序。如果免費應用程序首先安裝了付費應用程序,那麼免費應用程序無法啓動該意圖。返回權限拒絕。如果付費應用程序先安裝了免費應用程序,免費應用程序可以啓動意圖沒問題。重新啓動設備和/或強制停止應用程序不能解決問題。我附上了相關代碼。有些事告訴我我做錯了一些事情。

  • 免費應用程序清單(相關代碼):

    ... 
    <uses-permission android:name="com.company.license.PERMISSION" /> 
    ... 
    
  • 免費應用程序代碼來檢查意向(相關代碼):

    Intent KeyApp = new Intent("com.company.license.action.AUTH_1"); 
    KeyApp.putExtra("com.company.license.challenge", 1); 
    
    //If free app is installed first, an exception is thrown for not having the proper permission. If paid app is installed first, no exception is thrown 
    try { 
        startActivityForResult(KeyApp, COMMING_FROM_KEYAPP); 
    } catch (Exception e) { 
        cancelStartUp(); 
    } 
    
  • 付費應用清單(相關代碼):

    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
        package="com.company.installer.1" 
    ... 
    <permission 
        android:name="com.company.license.PERMISSION" 
        android:icon="@drawable/icon" 
        android:label="@string/app_name" 
        android:protectionLevel="normal" > 
    </permission> 
    
    <application 
        android:icon="@drawable/icon" 
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.NoDisplay" > 
    
        <activity 
         android:name="com.company.license.auth" 
         android:configChanges="keyboardHidden|orientation" 
         android:exported="true" 
         android:permission="com.company.license.PERMISSION" 
         android:theme="@style/Theme.Transparent" > 
         <intent-filter> 
          <action android:name="com.company.license.action.AUTH_1" /> 
    
          <category android:name="android.intent.category.DEFAULT" /> 
         </intent-filter> 
        </activity> 
    
        <activity 
         android:name="com.company.installer.redirect" 
         android:configChanges="keyboardHidden|orientation" 
         android:exported="true" 
         android:theme="@style/Theme.Transparent" > 
         <intent-filter> 
          <action android:name="android.intent.action.MAIN" /> 
    
          <category android:name="android.intent.category.LAUNCHER" /> 
         </intent-filter> 
        </activity> 
    </application> 
    
    </manifest> 
    

回答

11

把同樣的<permission>元素在這兩個應用程序。此外,由於這是特定於您的兩個應用程序,我會用android:protectionLevel="signature"代替normal - 這意味着用戶將永遠不需要批准許可,並沒有其他人可以請求許可。而且,這個配方將允許以任何順序安裝。

UPDATE:但是請注意,使用自定義權限會打開potential vulnerabilities, due to Android's "first one in wins" approach

更新#2:這是現在no longer supported as of Android 5.0,因爲兩個應用程序不能同時具有相同的<permission>元素,除非它們是由同一個簽名密鑰簽名。

+1

這樣做的伎倆。謝謝! – 2012-07-30 22:09:15

+4

問題:如果首次安裝的應用程序指定了,並且具有相同的權限,則在安裝時不會向用戶通知權限請求。安裝第二個應用後,第一個應用可以訪問需要該權限的第二個應用的組件。主要的安全問題? – 2014-01-30 18:04:38

+0

@MarkCarter:用戶肯定不會被提示輸入'簽名'級別的權限。但是,這並不取決於安裝順序。永遠不會出現'簽名'級別的權限。由於「簽名」級別權限是由一個開發人員(或團隊)編寫的代碼,所以假設這些權限控制着什麼數量來聚合內部通信,並且用戶不需要打擾。但是,如果您使用自定義的「正常」或「危險」權限看到您描述的行爲,那會讓我感到意外,我需要做更多的研究。 – CommonsWare 2014-01-30 18:09:13

2

我能夠解決此問題@CommonsWare在他的更新#2提及。只需通過只聲明將安裝在應用程序的權限。

說明: 我有應用程序A和應用程序B,用不同的簽名簽名。應用程序A需要使用應用程序B才能登錄,但應用程序A會先安裝並確保用戶安裝應用程序B.

由於應用程序B似乎是(登錄)服務,我在應用程序B中聲明瞭自定義權限。 B擁有其他應用可以使用的(意圖)服務,只要他們使用該許可並且位於我們的白名單中。所以應用程序B已經聲明瞭服務和許可。

但因爲BI應用程序發現之前安裝一個應用程序,我需要添加的權限,以及對應用A.否則應用一個似乎沒有安裝的應用程序B.後具有的權限我最好的猜測是,這是因爲許可的東西在安裝時完成。由於應用程序A沒有聲明權限,因此在安裝時沒有任何事情發生。但是,然後安裝了應用程序B,它具有權限,但應用程序A仍然沒有收到此權限。

但後來我測試了Android上的5跑進他們獨特的權限更改。所以我測試了一些流程和權限聲明,並提出了一個可行的解決方案: 在首先安裝的應用程序中聲明自定義權限!當然,這隻有在你知道哪個應用程序將首先安裝時纔有用。但在我的情況下,應用程序A依賴應用程序Bánd應用程序A安裝應用程序B,這是解決方案:)

相關問題