從歷史上看,Android的定製權限have been a mess和were install order dependent,這是衆所周知的expose vulnerabilities。
在API 21之前,有一個令人不安的解決方法,即在您的Manifest中聲明另一個應用程序的自定義權限,授予權限...但是,由於API 21,只有一個應用程序可以聲明自定義權限,將會阻止聲明相同許可的進一步申請。
替代方法是重新安裝需要權限的應用程序,以便它們被系統檢測到,但該is not a good user experience。或者在運行時檢查調用應用程序的權限,但that is not without its theoretical flaws。
問題
就Android棉花糖(6.0 - API 23)的應用程序需要來自用戶的,請求允許使用其自己的自定義權限。聲明的自定義權限不會自動授予。
這看起來很奇特,因爲現在只有一個應用程序可以聲明它。
要複製
聲明自定義權限,並在清單一個BroadcastReceiver。
<permission
android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"
android:description="@string/control_description"
android:icon="@mipmap/ic_launcher"
android:label="@string/control_label"
android:protectionLevel="normal or dangerous"/>
<uses-permission
android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/>
// etc
<receiver
android:name="com.example.app.MyBroadcastReceiver"
android:permission="com.example.app.permission.CONTROL_EXAMPLE_APP">
<intent-filter android:priority="999">
<action android:name="com.example.app.REQUEST_RECEIVER"/>
</intent-filter>
</receiver>
從第三方應用程序,聲明它使用清單中的自定義權限(並通過對話或設置接受),並調用:
final Intent intent = new Intent("com.example.app.REQUEST_RECEIVER");
context.sendOrderedBroadcast(intent, "com.example.app.permission.CONTROL_EXAMPLE_APP", new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
// getResultCode();
}
}, null, Activity.RESULT_CANCELED, null, null);
結果將返回取消和日誌將顯示:
system_process W/BroadcastQueue:權限拒絕:接收意圖{ ACT = com.example.app.REQUEST_RECEIVER FLG = 0×10(具有額外)}至 com.example.app/.MyBroadcastReceiver需要 com.example.app.permission.CONTROL_EXAMPLE_APP由於發件人 com.example.thirdparty
如果我使用標準ActivityCompat.requestPermissions()
對話框,允許用戶接受許可,正如你所期望的那樣,接收器能夠正常工作。
問題
這是預期的行爲?或者我忽略了某些東西?
這似乎可笑提出一個對話框說
應用程序示例應用程序要使用的示例應用程序
許可,它可能確實是關注用戶,爲他們提供這樣一個荒謬的請求。
我當然可以將權限描述和名稱改爲他們接受的內容,例如'與其他已安裝的應用程序'進行通信,但在我嘆息並採取該方法之前,我想我會問這個問題題。
注
有序廣播的例子是複製的問題。我的應用程序確實使用內容提供者和綁定服務的其他實現。這不是我需要的替代實施方式,而是對問題的確認。
感謝您閱讀這篇文章。
編輯:爲了闡明,對於其他實現,例如聲明服務的權限(這將是最容易複製的),自動授予聲明的自定義權限。
FWIW,我無法重現您的問題,至少在Android 7.1(Google Pixel)上。我將你的代碼複製到一個新的Android Studio項目中,並且不會從客戶端向接收者發送廣播並獲得響應。現在,我的示例可能比您的示例更簡單(例如,兩個應用程序都由相同的簽名密鑰簽名)。如果您可以創建一個示例應用程序來持續複製此問題,並且您可以在7.1上對其進行復制,請將[文檔問題](http://b.android.com)與開發人員預覽進行對照,其中包括示例應用程序和完整說明。 – CommonsWare
只是要清楚,你是否要求指導方針如何以合理的方式請求用戶的許可,他不會否認?或者你是否要求在他拒絕你的許可時提出解決方案?我很困惑 –
我認爲,應用程序請求自己的權限的事實可以被解釋爲一個「主開關」,如:「讓其他應用程序控制這個應用程序」。即使必須在第三方應用中授予權限才能控制示例應用,但某些用戶可能實際上正在使用它來完全禁止「可控性」功能。 (但仍然很奇怪,例如服務會自動獲得自定義權限......) – Gyebro