lollipop - android oreo
onRequestPermissionsResult no se llama en fragmento si se define tanto en fragmento como en actividad (7)
El método
requestPermissions
en Fragments requiere un nivel de API 23 o superior.
Si su aplicación está dirigida a una versión inferior, puede usar
FragmentCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
Primero debe agregar la dependencia support-v13:
implementation "com.android.support:support-v13:$supportLibVersion"
Tengo un fragmento en el que tengo vista de reciclaje y datos de configuración en esta vista de reciclaje usando el adaptador de vista de reciclaje.
Ahora, tengo un botón en el elemento de la lista del adaptador haciendo clic en el cual necesito verificar el permiso READ_EXTERNAL_STORAGE en Android para el nuevo modelo de permiso en Android.
He creado una nueva función en el fragmento de este adaptador para verificar si se otorga el permiso o no y solicitar permiso si ya no se ha otorgado.
He pasado MyFragment.this como un parámetro en el adaptador y llamando al método del fragmento en el botón, haga clic en el adaptador.
He usado el siguiente código para llamar a requestPermission en fragmento.
if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED)){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
ConstantVariables.READ_EXTERNAL_STORAGE);
}
He anulado el método
onRequestPermissionsResult
en fragmentos usando el siguiente código:
@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 {}
Pero no se llama, en lugar del método onRequestPermissionsResult de esta actividad se llama.
También he definido el mismo método onRequestPermissionsResult en la actividad principal del fragmento y se está llamando.
No puedo eliminar el método onRequestPermissionsResult de la actividad, pero quiero llamar al método onRequestPermissionsResult del fragmento cuando solicito permiso del fragmento. ¿Cómo puedo hacer esto? Estoy haciendo algo mal aquí, por favor, ayúdenme si alguien tiene una idea aquí.
Este problema fue causado realmente por NestedFragments. Básicamente, en la mayoría de los fragmentos hemos extendido un HostedFragment que a su vez extiende un CompatFragment. Tener estos fragmentos anidados causó problemas que finalmente fueron resueltos por otro desarrollador en el proyecto.
Estaba haciendo algunas cosas de bajo nivel, como el cambio de bits para que esto funcione, así que no estoy muy seguro de la solución final real
Para el tragetSDK 28, la verificación del SDK (> 23) y los permisos de solicitud del fragmento funcionarían. ActivityCompat.requestPermissions está fallando (si configura el código de solicitud por debajo de 65536, aparecerá el cuadro de diálogo de permiso y si el usuario lo permite, se otorgan los permisos, pero no se devolverá la llamada. Pero si configura por encima de 65536, ActivityCompat.requestPermissions aparecerá falla inmediatamente. No sé el razonamiento detrás de esta lógica. Puede ser un error o intencional).
Código de trabajo:
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
}
Respuesta editada para cubrir problemas más amplios
Creo que estás confundiendo el método para el fragmento y la actividad. Tuve un problema similar en mi proyecto el mes pasado. Por favor, compruebe si finalmente tiene lo siguiente:
- En AppCompatActivity use el método ActivityCompat.requestpermissions
- En el fragmento de soporte v4, debe usar permisos de solicitud
- La captura es si llama a AppcompatActivity.requestpermissions en su fragmento, la devolución de llamada se activará y no se fragmentará
-
Asegúrese de llamar a
super.onRequestPermissionsResult
desdesuper.onRequestPermissionsResult
de la actividad.
A ver si ayuda.
Solicité permiso de ubicación de un fragmento y en el fragmento, necesitaba cambiar esto:
ActivityCompat.requestPermissions(getActivity(), new String[]{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);
a esto:
requestPermissions(new String[]{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);
entonces se llamó a onRequestPermissionsResult en el fragmento.
Verifique que tanto
onRequestPermissionsResult
en
onRequestPermissionsResult
y dentro de su
Fragment
contengan el mismo valor.
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();
}
}
cambiar permiso