studio - Pidiendo permisos en tiempo de ejecución, Android M+
requestpermissions android example (3)
En primer lugar, sé que esta es una pregunta duplicada, pero he revisado las respuestas de otras preguntas similares y no he podido encontrar el éxito con ninguna de esas soluciones.
Desarrollé una aplicación que funciona perfectamente en mi dispositivo de prueba, que es un Samsung S4 con Android L (5.0.1). Sin embargo, me gustaría que esta aplicación también funcione en las versiones más nuevas de Android.
Entiendo que los permisos de solicitud han cambiado para Android M +, por lo que deben solicitarse en tiempo de ejecución, pero cuando intento implementar esto, el cuadro de diálogo nunca aparece y, por lo tanto, nunca se solicitan los permisos necesarios.
El permiso que estoy solicitando es ACCESS_FINE_LOCATION
.
Aquí está el código relevante de mi archivo manifiesto:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Donde pido permiso si aún no está otorgado:
if (ActivityCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
startGeofenceMonitoring();
} else {
askForPermission(android.Manifest.permission.ACCESS_FINE_LOCATION,LOCATION);
}
función askPorPermission (ligeramente modificada del ejemplo de Google):
private void askForPermission(String permission, Integer requestCode) {
if (ContextCompat.checkSelfPermission(MapsActivity.this, permission) != PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(MapsActivity.this, permission)) {
//This is called if user has denied the permission before
//In this case I am just asking the permission again
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
} else {
Log.d(TAG, "askForPermission: " + permission);
ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
}
} else {
Toast.makeText(this, "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
}
}
Y la función onRequestPermissionsResult:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult: " + requestCode);
switch (requestCode) {
case 1:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "onRequestPermissionsResult: request");
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
startGeofenceMonitoring();
}
break;
}
}
Como dije, el cuadro de diálogo que solicita los permisos nunca aparece, pero mi consola me dice que ActivityCompat.requestPermissions(MapsActivity.this, new String[]{permission}, requestCode);
se llama, y después de una gran cantidad de investigaciones todavía no estoy seguro de por qué no está funcionando. Lo único que creo que podría deberse a esto es que esta actividad es un Fragmento que muestra un mapa de Google Maps. Intenté solicitar los permisos en otra actividad, pero sucede exactamente lo mismo.
Gracias.
EDITAR
Así que solo probé el código que publiqué aquí en un proyecto completamente nuevo y funcionó perfectamente y mostró el cuadro de diálogo. Ahora estoy realmente confundido en cuanto a qué impide que este cuadro de diálogo se muestre en mi proyecto actual.
Me las arreglé para arreglarlo!
En mi aplicación, he utilizado una actividad diferente para controlar las pestañas y qué actividad se muestra al usuario. Esta es la primera actividad que se mostrará y creo que es la única actividad que se muestra en todo el programa, pero solo muestra el contenido de las otras actividades. Entonces, cuando solicité los permisos para MapsActivity, no se mostró porque MapsActivity no era el que realmente estaba presente.
Mi explicación puede estar equivocada, así que aquí está el código de mi TabBarActivity:
TabHost tabHost = getTabHost();
TabHost.TabSpec spec;
Intent intent;
intent = new Intent().setClass(this, SecondActivity.class);
spec = tabHost.newTabSpec("Second").setIndicator("Profile")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, MapsActivity.class);
spec = tabHost.newTabSpec("First").setIndicator("Location")
.setContent(intent);
tabHost.addTab(spec);
intent = new Intent().setClass(this, ThirdActivity.class);
spec = tabHost.newTabSpec("Third").setIndicator("Settings")
.setContent(intent);
tabHost.addTab(spec);
final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
private void requestPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
ActivityCompat
.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_ASK_PERMISSIONS:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT)
.show();
} else {
// Permission Denied
Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT)
.show();
}
break;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
El siguiente código funcionó para mí.
public static final int MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE=1;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.activity_tracks,container,false);
getPermission();
...
}
public void getPermission(){
if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
if(ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),Manifest.permission.READ_EXTERNAL_STORAGE)){
}else{
ActivityCompat.requestPermissions(getActivity(),new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE);
}
}else{
getSongDetails();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case -1:
//hello
break;
case MY_PERMISSION_REQUEST_READ_EXTERNAL_STORAGE:
if(grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED){
getPermission();
}else{
Toast.makeText(getActivity(),"You''ve denied permission",Toast.LENGTH_LONG).show();
}
return;
default:
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}