tiempo studio solicitar programacion permisos ejecución durante cómo camara android android-fragments android-permissions

android - studio - Cómo verificar el permiso en fragmentos



permisos gps android studio (8)

Quiero verificar un permiso dentro de un fragmento.

mi código:

// Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION)) { // Show an explanation to the user *asynchronously* -- don''t block // this thread waiting for the user''s response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(getActivity(), new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } }

pero onRequestPermissionsResult no se llama después de permitir o denegar.

@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 1: { Log.e("test","0"); // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. //yes Log.e("test","1"); Intent intent = new Intent(getActivity(), MapsActivity.class); intent.putExtra("latitude", 35.694828); intent.putExtra("longitude", 51.378129); startActivity(intent); } else { utilityFunctions.showSweetAlertWarning(getActivity(),r.getString(R.string.str_warning_title_empty), r.getString(R.string.str_you_must_allow_this_permission_toast), r.getString(R.string.str_warning_btn_login)); Log.e("test","2"); } return; } // other ''case'' lines to check for other // permissions this app might request } }


Así es como lo hice, funciona para mí. ¡Gracias!

Para la actividad:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

Para el fragmento:

requestPermissions(permissionsList, REQUEST_CODE);


He hecho lo siguiente para verificar un permiso dentro de un fragmento.

if (ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(getActivity(), new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION); } else { Log.e("DB", "PERMISSION GRANTED"); }


Lo que funcionó para mí fue llamar al método onRequestPermissionsResult en la actividad dentro de la cual se implementa el fragmento en lugar de llamarlo en el mismo fragmento. Dentro del método onCreateView en fragmento:

Button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE); if (permissionCheck != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA); }else{ //Do your work fetchMethod(); } } });

En la Actividad que ayuda a implementar fragmentos, fuera del método onCreate :

@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_MEDIA: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { fetchMethod(); }else{ Toast.makeText(getApplicationContext(), "Permission not granted!", Toast.LENGTH_SHORT).show(); } break; default: break; } }


Para manejar permisos en un método Fragment call requestPermissions . Si anula el método onRequestPermissionsResult tanto en el fragmento como en la actividad que contiene ese fragmento, asegúrese de llamar a super.onRequestPermissionsResult(...) en el método de actividad para propagar la llamada al método onRequestPermissionsResult en el fragmento.



Usando Kotlin, llama a requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE) y agrega la siguiente anulación a su fragmento

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit { }


onRequestPermissionsResult se invoca en la actividad, no en el fragmento. Intente anular onRequestPermissionsResult en la actividad en su lugar.


Fragment tiene requestPermissions() y onRequestPermissionsResult() , onRequestPermissionsResult() .

Pero checkSelfPermission() es de ActivityCompat (no requiere Activity , solo Context ).

if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions( //Method of Fragment new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS_CODE_WRITE_STORAGE ); } else { downloadImage(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == REQUEST_PERMISSIONS_CODE_WRITE_STORAGE) { if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE) && grantResults[0] == PackageManager.PERMISSION_GRANTED) { proceedWithSdCard(); } } }