Recyclerviewアダプターを使用して、このrecyclerviewにrecyclerviewと設定データがあるフラグメントがあります。
現在、アダプターのリスト項目にボタンがあります。このボタンをクリックして、Androidの新しい許可モデルのAndroidのREAD_EXTERNAL_STORAGE許可を確認する必要があります。
このアダプターのフラグメントに新しい関数を作成して、許可が付与されているかどうかを確認し、まだ付与されていない場合は許可を要求します。
MyFragment.thisをアダプターのパラメーターとして渡し、アダプターのボタンクリックでフラグメントのメソッドを呼び出しました。
次のコードを使用して、requestPermissionをフラグメントで呼び出しています。
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED)){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
}
以下のコードを使用して、フラグメント内のonRequestPermissionsResult
メソッドをオーバーライドしました。
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case ConstantVariables.READ_EXTERNAL_STORAGE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, proceed to the normal flow.
startImageUploading();
} else {}
ただし、このアクティビティのonRequestPermissionsResultメソッドが呼び出される代わりに、呼び出されることはありません。
フラグメントの親アクティビティでも同じonRequestPermissionsResultメソッドを定義しており、それが呼び出されています。
アクティビティのonRequestPermissionsResultメソッドを削除することはできませんが、フラグメントの許可をリクエストするときにフラグメントのonRequestPermissionsResultメソッドを呼び出したいです。これどうやってするの?私はここで何か間違っていますか、誰かがここでアイデアを持っているなら助けてください。
より広範な問題をカバーするために回答を編集
フラグメントとアクティビティの方法を混同していると思います。先月、私のプロジェクトで同様の問題を抱えていました。最終的に次のものがあるかどうかを確認してください。
onRequestPermissionsResult
からsuper.onRequestPermissionsResult
を呼び出してください。それが役立つかどうかを確認します。
フラグメントにロケーション許可を要求し、フラグメント内でこれを変更する必要がありました。
ActivityCompat.requestPermissions(getActivity(), new String[]{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);
これに:
requestPermissions(new String[]{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);
次に、フラグメント内でonRequestPermissionsResultが呼び出されました。
FragmentsのメソッドrequestPermissions
には、APIレベル23以上が必要です。
アプリが下位バージョンをターゲットにしている場合は、使用できます
FragmentCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
まず、support-v13依存関係を追加する必要があります。
implementation "com.Android.support:support-v13:$supportLibVersion"
private void showContacts() {
if (getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
PERMISSIONS_REQUEST_READ_STORAGE);
} else {
doShowContacts();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults) {
if (requestCode == PERMISSIONS_REQUEST_READ_STORAGE
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
doShowContacts();
}
}
許可を変更する
PERMISSION_REQUEST_CODE
inonRequestPermissionsResult
とinsideFragment
の両方に同じ値が含まれていることを確認します。
TragetSDK 28の場合、SDKチェック(> 23)およびフラグメントからのrequestpermissionsは機能します。 ActivityCompat.requestPermissionsが失敗します(要求コードを65536未満に設定すると、許可ダイアログが表示され、ユーザーが許可を許可すると許可が提供されますが、コールバックは発生しません。ただし、65536を超えると、ActivityCompat.requestPermissionsすぐに失敗します。このロジックの背後にある理由はわかりません。バグまたは意図的な可能性があります。
作業コード:
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
}