我的窗口小部件會調用Activity
作用域之外的安全權限。 之外是否可以請求Android M的權限?Android M請求權限非活動
回答
不,這是不可能的。你可以做的是發送一個通知,用戶可以點擊然後使用一個活動來請求/管理權限(也許用對話框主題)。
您只能從活動或片段請求權限。
找出活動或片段中您感覺App需要許可的點,然後調用requestPermission方法。發送通知將不起作用,因爲您希望處理代碼,直到您獲得請求的權限,然後從onRequestPermissionResult()方法恢復您的功能。
我認爲這是可能要求許可的活動之外,只要你從支持庫使用的方法
ActivityCompat.requestPermissions (Activity activity, String[] permissions, int requestCode)
,並通過活動作爲方法的參數。
例如:
ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE);
其中targetActivity是要實現該方法的活動:
onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)
這將處理德許可請求結果的方法。
活動之外意味着來自服務或廣播接收器,根本沒有活動。這個答案根本沒有幫助。 –
通常,您可以將上下文對象傳遞給非活動類,並在需要上下文並且沒有活動時使用它。然而,要求權限是一個不同的故事。 – Pedram
@加貝一方面你是正確的,但另一方面,這個問題並沒有指出提問者想要調用請求的位置。所以我認爲這是一個正確的答案。 – Opiatefuchs
如果您想要從活動外部請求許可,您可以創建不同的類並從活動中擴展該類。使用constructer來獲取和設置類的上下文。
public class Permissions extends Activity {
private static final int MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 1;
private Context context;
public Permissions(Context context) {
this.context = context;
}
public void checkWriteExternalStoragePermission() {
final int MY_PERMISSIONS_REQUEST_PHONE_CALL = 1;
ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
}
現在,創建創建對象並將上下文傳遞給需要請求權限的構造函數。
Permissions permissions = new Permissions(SplashScreen.this);
permissions.checkWriteExternalStoragePermission();
但是,這種方法存在不利之處,即使在活動被銷燬之後,對象仍可能保留Activity上下文的引用,這可能導致內存泄漏。 –
這是作弊。你的代碼實際上並沒有使用權限是一個活動的事實,因爲你不會將它傳遞給requestPermissions()。如果你這樣做,它會失敗。相反,您將給定的上下文傳遞給requestPermissions(),假設它是一個Activity。但問題的關鍵是,如果根本沒有活動,該怎麼辦? – Lev
只是對那些不瞭解更好的人的警告,不要使用此代碼! –
可以從您的活動外部調用requestPermissions(),但在您的類中您應該擁有該活動的上下文。
ActivityCompat.requestPermissions((Activity)context, new String[]{permission.READ_PHONE_STATE}, REQUEST_CODE);
爲了工作,你應該實現以下方法,在您的活動
onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)
使這一重寫方法得到執行,當用戶水龍頭上允許或拒絕對彈出
按鈕您可以使用Easy Permissions庫。
Android要求這些請求來自Activity
。通過輕鬆許可,這不再是一個問題,只要您提供Context
,您可以從任何地方請求許可。另外,如果您請求已授予的權限,則不會提示用戶。
完全披露,公司管理和開發這個免費使用圖書館。這就是說,我們相信它是一個有用的工具,否則我們不會分享它。
這對我沒有任何意義。如果Android真的需要使用活動來請求權限,那麼您的庫必須是純粹的魔術,因爲它可以做到不可能。事實是,你使用上下文。這與標準checkSelfPermission()一樣。我無法看到使用第三方庫進行此權限檢查的真正優勢。也許我想念一些東西... –
@TheincredibleJan感謝您伸出援手。 Android需要一個「活動」。圖書館需要「上下文」,就像許多圖書館一樣 - 這是神奇的,但它仍然基於現實世界:)。最大的優點是你可以請求從任何地方啓用許可,即使是不是「活動」的類。此外,最新版本將允許您自動啓用「Manifest」文件中的所有權限。 GitHub頁面上有一個示例應用程序;如果你有幾分鐘,你一定要檢查出來。如果您還有其他問題,請告訴我們。 –
- 1. Android M請求onSurfaceTextureAvailable回調權限不在活動
- 2. Android M請求權限不起作用
- 3. 活動意圖權限Android M SDK 23
- 4. 非活動類的權限
- 5. Android M權限系統:識別需求
- 6. Android M AppWidgetProvider權限
- 7. 檢查M權限被授予或拒絕從非活動類
- 8. Android:請求多個權限時僅請求第一個權限
- 9. 請求位置來自服務的權限Android M
- 10. Android權限請求錯誤
- 11. Android:重新請求權限
- 12. Android權限不被請求
- 13. Android請求多權限
- 14. Android權限自動被拒絕請求MainActivity中的權限
- 15. Android M權限回撥
- 16. Android M新權限模型
- 17. 請求寫權限
- 18. Facebook請求權限
- 19. DayDream權限請求
- 20. Android M上的WiFi請求
- 21. ios - 請求多個權限
- 22. 權限未得到請求
- 23. android - 請求權限不存在
- 24. android:運行時請求權限
- 25. Android上的UnityPlayer請求權限
- 26. Android - 更改READ_PHONE_STATE權限請求消息
- 27. 請求代碼在Android的權限
- 28. 的Android程序請求的權限
- 29. Android偏好特定權限請求
- 30. 無法從Android Facebook SDK請求權限
配置活動也是處理這個問題的好地方。雖然用戶可以進入權限屏幕並撤銷之前給定的任何權限,但仍然需要通知方法。我還會考慮將這個小部件放入一個許可撤銷的UI狀態作爲替代方法。 –