私は連絡先の許可を求める必要があります。アプリケーションが起動すると、ViewModelの部分では許可が必要なメソッドを呼び出す必要があります。私は許可されているかどうかをチェックする必要がありますか?私のViewModelではActivityへの参照がなく、問題を解決する方法はありません。権限を確認する方法はViewModelで許可されていますか?
0
A
答えて
0
LocalBroadcastManager
を使用してカスタムインテントでアクセス権を要求するPermissionRequester
クラスを作成できます。あなたのベースアクティビティがこの許可要求を解決し、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
のコンストラクタに結果の受信に類似しています。ただし、onResume
とunregisterReceiver
のregisterReceiver
をに記載してください。
関連する問題
- 1. ユーザーがpublish_actions権限を許可しているかどうかを確認する方法
- 2. ユーザーが特定の権限を許可しているかどうかを確認する方法Facebook iOS
- 3. 方法でのAndroid権限の確認
- 4. Androidで実行時にユーザーの権限が許可されているかどうかを確認するにはどうすればよいですか?
- 5. XcodeのコマンドラインツールプロジェクトでCoreLocation権限が許可されていますか?
- 6. 写真にアクセスする権限を確認する方法は?
- 7. Codename One(Android 6.0+)でRECORD_AUDIOの権限が付与されているかどうかを確認する方法
- 8. NETWORK SERVICEの読み取り権限を許可する方法
- 9. URLにhttp権限ヘッダーが設定されているかどうかを確認する方法
- 10. Azureの許可権限が
- 11. marklogicのユーザー権限を確認する方法
- 12. snmpv3のユーザ権限を確認する方法
- 13. アプリレベルでSuper_user権限がどのように許可されますか?
- 14. youtube videoが許可されている国を確認するにはどうすればいいですか?
- 15. Androidの権限はどこで確認できますか?
- 16. SSRS 2012のユーザーの許可を確認する方法はありますか?
- 17. Androidにインストールされているアプリケーションで使用されている権限のリストを確認する
- 18. 推奨されていないアクセス許可を確認するにはどうすればよいですか?
- 19. 許可されていないキー文字を許可する方法。 Codeigniterで?
- 20. ロールで機能しない権限を許可するMVC C#
- 21. jQueryのカスタム確認ボックスで許可されているイベントをブロックする
- 22. リスティングリソースを許可する良いPHP権限フレームワークは何ですか?
- 23. 許可を確認し、許可されていれば、ニュースフィードに記事を公開してください
- 24. WindowsでPerlを使用して管理者権限を確認する方法はありますか?
- 25. 許可されたブロックチェーンがブロックチェーンに権限を格納していないのはなぜですか?
- 26. ラッパーでアクセス許可を確認する
- 27. 最小限の特権でイメージのタグ付けを許可する方法
- 28. 電話がロックされているときに実行時に許可を確認する方法は?
- 29. 権限が編集を許可していないときにGoogle Apps Script - Spreadsheet.setActiveSheetが認識されない
- 30. クライアントのサーバーでメールの送信が許可されていることを確認する方法
"ViewModelの部分では、私は許可が必要なメソッドを呼び出す必要があります" - IMHO、これはアーキテクチャのバグです。 'ViewModel'が' Bitmap'よりも複雑なもので動作している場合、あなたの 'ViewModel'は間違った責任を持ちます。 – CommonsWare
@CommonsWare ViewModelでは、メソッドgetContacts()やその他の権限メソッドが必要です。パーミッションが与えられていないというチェックがある場合、メソッドは呼び出されません。 ViewModelのように、チェック部分を整理する場所がわかりません。私はActivityへの参照をしたくありません。 –
"ViewModelでは、メソッドgetContacts()やその他の権限が必要なメソッドを呼び出す" - IMHO、 'ViewModel'以外のものは、' ViewModel'で 'setContacts()'を呼び出す必要があります。 'ViewModel'はPOJOのようなものではありません。 – CommonsWare