我需要問聯繫人的權限和應用程序啓動時我問,在ViewModel部分我需要調用需要權限的方法。我需要檢查權限是否由用戶授權然後調用,但爲了檢查權限,我需要訪問活動。而在我的ViewModel中,我沒有對Activity的引用,也不想擁有,我該如何克服這個問題?在ViewModel中如何檢查權限?
0
A
回答
0
您可以創建PermissionRequester
類,該類使用LocalBroadcastManager
來請求具有自定義意圖的權限。您的基本活動將解析此權限請求,並使用LocalBroadcastManager
將結果發送回PermissionRequester
。您的ViewModel然後可以使用PermissionRequester.getInstance().requestPermission(permission)
,而無需連接到您的活動。爲PermissionRequester.java
下面的示例代碼:
public class PermissionRequester {
private static PermissionRequester instance;
public static synchronized PermissionRequester getInstance() {
instance = instance == null ? new PermissionRequester() : instance;
return instance;
}
private final Map<String, WeakReference<OnResultListener>> pendingListeners = new HashMap<>();
private PermissionRequester() {
LocalBroadcastManager.getInstance(MyApplication.getInstance()).registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent != null ? intent.getAction() : "";
if ("ACTION_PERMISSION_REQUEST_RESPONSE".equals(action)) {
callbackListener(intent.getStringExtra("LISTENER"), intent.getIntExtra("RESULT", -1));
}
}
}, new IntentFilter("ACTION_PERMISSION_REQUEST_RESPONSE"));
}
public void requestPermission(@NonNull OnResultListener listener, @NonNull String permission) {
pendingListeners.put(listener.getClass().getName() + listener.hashCode(), new WeakReference<>(listener));
Intent requestPermissionIntent = new Intent("ACTION_REQUEST_PERMISSION");
requestPermissionIntent.putExtra("PERMISSION", permission);
LocalBroadcastManager.getInstance(MyApplication.getInstance().getApplicationContext()).sendBroadcast(requestPermissionIntent);
}
private void callbackListener(String listener, int result) {
WeakReference<OnResultListener> listenerReference = pendingListeners.get(listener);
OnResultListener onResultListener = listenerReference != null ? listenerReference.get() : null;
if (onResultListener != null) {
pendingListeners.remove(listenerReference);
if (result == 1) {
onResultListener.onPermissionGranted();
} else if (result == 0) {
onResultListener.onPermissionDenied();
}
}
}
public interface OnResultListener {
void onPermissionGranted();
void onPermissionDenied();
}
}
的代碼,即可獲得在你的基地活動自定義意圖是類似於結果在PermissionRequester
的構造函數接收。但請注意撥打registerReceiver
,onResume
和unregisterReceiver
的。
相關問題
- 1. 如何在Plone中檢查權限?
- 2. Android如何檢查權限?
- 3. 在HDFS中檢查權限
- 4. 檢查權限
- 5. 檢查權限?
- 6. 如何檢查片段中的權限
- 7. Liferay:JSF中的權限檢查
- 8. Mailitem.SentOnBehalfOfName:檢查權限在Exchange
- 9. Android檢查權限
- 10. 檢查用戶權限的權限
- 11. Windbg,如何檢查內存段權限?
- 12. 如何檢查管理員權限C#
- 13. 如何檢查userLocation的權限
- 14. 如何檢查國旗的權限?
- 15. Ant Build-Script如何檢查root權限
- 16. 如何檢查SharePoint文檔權限?
- 17. 檢查,如果權限已被Android中
- 18. 在RESTful API中檢查用戶權限
- 19. 在Rails中檢查Facebook用戶權限
- 20. 在Swift 2.0中檢查權限
- 21. 如何在.NET中檢查RegistryKey權限,如ReadKey或FullControl?
- 22. 在ViewModel中檢查TextBox-Validation
- 23. 如何在Django中檢查當前用戶的權限?
- 24. 如何在views.py中檢查用戶的權限?
- 25. 如何在Sonar插件中檢查用戶權限
- 26. 如何在編輯用戶表單中檢查權限?
- 27. 如何在Salesforce中檢查用戶的CRUD權限?
- 28. 如何在sybase ase上檢查表中的權限
- 29. 如何在數據庫表中檢查多個shiro權限?
- 30. 如何在java中檢查目錄的寫入權限?
「所以在ViewModel部分我需要調用需要權限的方法」 - 恕我直言,這是一個架構錯誤。如果一個'ViewModel'處理比'Bitmap'更復雜的任何事情,那麼你的'ViewModel'就有錯誤的職責。 – CommonsWare
@CommonsWare在ViewModel中,我調用方法getContacts()或任何其他方法來獲得我需要的權限。如果將檢查權限未被授予,該方法將不會被調用。我不知道在哪裏組織檢查部分,因爲在ViewModel中我不想引用Activity。 –
「在ViewModel中,我調用方法getContacts()或任何其他方法來獲取我需要的權限」 - 恕我直言,ViewModel之外的某些東西應該調用'ViewModel'上的'setContacts()'。一個'ViewModel'應該只是一個POJO。 – CommonsWare