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 obtener un 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 parámetro en el adaptador y llamando al método del fragmento al hacer clic en el botón 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 onRequestPermissionsResult
método fragmentado 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í? Ayúdenme si alguien tiene una idea aquí.
fuente
Respuestas:
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:
super.onRequestPermissionsResult
desde la actividadonRequestPermissionsResult
.A ver si ayuda.
fuente
super.onrequestpermissionresult
el resultado onrequestpermission de la actividad, llame al resultado onrequestpermissionresultado del fragmento cuando solicito permiso para usarrequestpermissions
. Esto está funcionando bien ahora, muchas gracias .. :)Solicité permiso de ubicación de un fragmento y en el fragmento, necesitaba cambiar esto:
a esto:
entonces se llamó a onRequestPermissionsResult en el fragmento.
fuente
Este es un error común que la gente comete al codificar malvavisco.
Cuando esté en AppCompatActivity, debe usar ActivityCompat.requestPermissions; Cuando esté en android.support.v4.app.Fragment, debe usar simplemente requestPermissions (este es un método de instancia de android.support.v4.app.Fragment) Si llama a ActivityCompat.requestPermissions en un fragmento, se llama a la devolución de llamada onRequestPermissionsResult la actividad y no el fragmento
Si está llamando a este código desde un fragmento, tiene su propio método requestPermissions.
Entonces, el concepto básico es: si está en una actividad, llame al
y si está en un fragmento, solo llame
Para la referencia, obtuve la respuesta de este enlace https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/
fuente
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
Primero debe agregar la dependencia support-v13:
fuente
cambia esto :
a esto :
fuente
cambiar permiso
fuente
Esta respuesta aceptada no me funcionó, así que encontré mi propia solución, que se explica a continuación:
1.Primero creé un método, en fragmento:
2. Y luego lo llamó desde su actividad subyacente:
Y está funcionando ...
fuente
Verifique que tanto
PERMISSION_REQUEST_CODE
dentroonRequestPermissionsResult
como dentro de suFragment
contiene el mismo valor.fuente
Para el tragetSDK 28, la verificación SDK (> 23) y los permisos de solicitud del fragmento funcionarían. ActivityCompat.requestPermissions está fallando (si establece 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 producirá una devolución de llamada. Pero si establece 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:
fuente
Si está trabajando con Kotlin, debe especificar de manera explícita que está llamando al método de fragmento, no a la actividad
Permisos de Android M: no se llama a onRequestPermissionsResult ()
Solicite permisos de tiempo de ejecución de v4.Fragment y haga que la devolución de llamada vaya a Fragment?
fuente
Tuve el mismo problema. Su fragmento se puede inicializar desde el diseño de la actividad. Como eso:
main_activty.xml
Este problema se solucionó para mí cuando he usado
FragmentTransaction
en vezfuente
en las API inferiores a 23, puede crear una interfaz en la actividad, luego implementarla en el fragmento secundario y, cuando obtiene la solicitud de permiso, la actividad la pasa a la interfaz implementada en fragmento. Es así de simple :)
fuente
puedes llamar al método Fragment a continuación
fuente
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
fuente