2016-03-14 14 views
31

私はrecyclerviewアダプタを使用して、このrecyclerview内にrecyclerviewと設定データがあるフラグメントを持っています。フラグメントとアクティビティの両方で定義されている場合、onRequestPermissionsResultはフラグメント内で呼び出されていません

今、AndroidのREAD_EXTERNAL_STORAGE権限とAndroidの新しい権限モデルを確認する必要があるアダプタのリストアイテムにボタンがあります。

私は、このアダプターのフラグメントに新しい機能を作成して、許可が与えられているかどうかを確認し、まだ許可されていない場合に許可を要求しました。

アダプターのパラメーターとしてMyFragment.thisを渡し、アダプターのボタンをクリックしてフラグメントのメソッドを呼び出しました。

以下のコードを使用して、requestPermissionをフラグメントで呼び出しました。

@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メソッドが呼び出さなっているのではなく、呼ば取得されていません。

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メソッドをオーバーライドしています。

私はフラグメントの親アクティビティでも同じonRequestPermissionsResultメソッドを定義しており、呼び出されています。

アクティビティのonRequestPermissionsResultメソッドを削除できませんが、フラグメントからのアクセス許可を要求するときに、フラグメントのonRequestPermissionsResultメソッドを呼び出す必要があります。 どうすればいいですか?私はここで何か間違っているのですが、もし誰かがここでアイデアを持っていたら私を助けてください幅広い問題

をカバーするための答えを編集

+1

(HTTP [フラグメントのタイム権限を実行する]このリンクを参照してください。 /stackoverflow.com/questions/34342816/android-6-0-multiple-permissions/38563687#38563687)これは正確な解決策です –

答えて

110

私はあなたがフラグメントと活動のための方法を混乱していると思います。先月同様の問題がありました。 AppCompatActivityで

  1. はあなたがAppcompatActivity.requestpermissionsを呼び出す場合は、
  2. キャッチがあるrequestpermissionsを使用する必要がありv4のサポートフラグメントでは、この方法にActivityCompat.requestpermissions
  3. を使用する:あなたは最終的には以下の持っているかどうかを確認してくださいあなたのフラグメント、そしてコールバックはフラグメントではなくアクティビティになります
  4. アクティビティのonRequestPermissionsResultからsuper.onRequestPermissionsResultに必ず電話してください。

参考にしてください。

+3

あなたの活動にsuper.onrequestpermissionresultが設定されていることを再度確認してください。 – VarunJoshi129

+10

'super.onrequestpermissionresult 'は、アクティビティのonrequestpermission結果でフラグメントのonrequestpermissionを呼び出します'requestpermissions'を使ってパーミッションを要求すると結果になります。 これはうまくいきました。ありがとうございます。:) –

+0

スレッドを閉じるために答えを受け入れる – VarunJoshi129

-1

この問題は実際にはNestedFragmentsによって発生しています。基本的に私たちが持っているほとんどのフラグメントはHostedFragmentを継承しており、次にこれがCompatFragmentを継承します。これらのネストされたフラグメントを持つと、最終的にプロジェクトの別の開発者が解決した問題が発生しました。

彼はこの私が実際に最終的なソリューション

+0

答えをコピーするのではなく、リンクを提供するだけです。 - https://stackoverflow.com/a/33081173/630833 – jayeffkay

1
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(); 
} 

}

のあまりよく分からないので、作業を取得するために、切り替えビットのようにいくつかの低レベルのものをしていました変更許可

+2

こんにちはuser2002721;あなたのコードは正しいかもしれませんが、いくつかの文脈ではより良い答えになります。たとえば、この提案された変更がどのようにしてなぜ問題の問題を解決するのか、そしておそらく関連文書へのリンクを含む理由を説明することができます。そうすれば、彼らにとってより有用になり、同様の問題に対する解決策を探している他のサイトの読者にとってもより有用になります。 –

0

PERMISSION_REQUEST_CODEonRequestPermissionsResultFragmentの中に同じ値が含まれています。

1

フラグメントのメソッドrequestPermissionsには、APIレベル23以上が必要です。
のアプリは、あなたが

FragmentCompat.requestPermissions(this, 
      new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
      ConstantVariables.READ_EXTERNAL_STORAGE); 

ファーストを使用することができます下のバージョンをターゲットにしている場合、あなたがサポート-V13の依存関係を追加する必要があります:/:

implementation "com.android.support:support-v13:$supportLibVersion"