我需要問聯繫人的權限和應用程序啓動時我問,在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. 在HDFS中檢查權限
- 2. 檢查權限
- 3. 如何檢查片段中的權限
- 4. Android檢查權限
- 5. 如何檢查國旗的權限?
- 6. 如何檢查SharePoint文檔權限?
- 7. Ant Build-Script如何檢查root權限
- 8. 如何檢查管理員權限C#
- 9. 檢查,如果權限已被Android中
- 10. 在Swift 2.0中檢查權限
- 11. 在RESTful API中檢查用戶權限
- 12. 在Rails中檢查Facebook用戶權限
- 13. 如何在.NET中檢查RegistryKey權限,如ReadKey或FullControl?
- 14. 如何在Sonar插件中檢查用戶權限
- 15. 如何在java中檢查目錄的寫入權限?
- 16. 如何在marklogic中檢查用戶權限
- 17. Android Marshmallow檢查權限
- 18. 檢查Facebook上的權限
- 19. 靜態檢查rest_framework權限
- 20. 檢查權限請求
- 21. 檢查文件權限
- 22. 檢查文件權限
- 23. 位置權限檢查和授權
- 24. 權限安全檢查在Linux?
- 25. 檢查用戶權限在Mac
- 26. 在執行之前檢查sp_send_email權限
- 27. 檢查Oracle中目錄的權限
- 28. 檢查Django模板中的權限
- 29. laravel委託如何檢查角色在刀片上的權限?
- 30. 如何在psql控制檯上檢查對函數的權限
「所以在ViewModel部分我需要調用需要權限的方法」 - 恕我直言,這是一個架構錯誤。如果一個'ViewModel'處理比'Bitmap'更復雜的任何事情,那麼你的'ViewModel'就有錯誤的職責。 – CommonsWare
@CommonsWare在ViewModel中,我調用方法getContacts()或任何其他方法來獲得我需要的權限。如果將檢查權限未被授予,該方法將不會被調用。我不知道在哪裏組織檢查部分,因爲在ViewModel中我不想引用Activity。 –
「在ViewModel中,我調用方法getContacts()或任何其他方法來獲取我需要的權限」 - 恕我直言,ViewModel之外的某些東西應該調用'ViewModel'上的'setContacts()'。一個'ViewModel'應該只是一個POJO。 – CommonsWare