web-dev-qa-db-ja.com

フラグメントとアクティビティの両方で定義されている場合、onRequestPermissionsResultはフラグメントで呼び出されません

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メソッドを呼び出したいです。これどうやってするの?私はここで何か間違っていますか、誰かがここでアイデアを持っているなら助けてください。

104

より広範な問題をカバーするために回答を編集

フラグメントとアクティビティの方法を混同していると思います。先月、私のプロジェクトで同様の問題を抱えていました。最終的に次のものがあるかどうかを確認してください。

  1. AppCompatActivityでは、メソッドActivityCompat.requestpermissionsを使用します
  2. V4サポートフラグメントでは、requestpermissionsを使用する必要があります
  3. キャッチは、フラグメントでAppcompatActivity.requestpermissionsを呼び出すと、フラグメントではなくコールバックがアクティビティになります
  4. アクティビティのonRequestPermissionsResultからsuper.onRequestPermissionsResultを呼び出してください。

それが役立つかどうかを確認します。

274
VarunJoshi129

フラグメントにロケーション許可を要求し、フラグメント内でこれを変更する必要がありました。

            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が呼び出されました。

46
fullMoon

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"
6
Juan Cruz Soler
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();
 }

}

許可を変更する

1
user2002721

PERMISSION_REQUEST_CODE inonRequestPermissionsResultとinsideFragmentの両方に同じ値が含まれていることを確認します。

0
karenms

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);
                    }
0