Appcelerator no pudo encontrar el método android.app.Activity.checkSelfPermission
Parece que no puedo obtener la ubicación geográfica para trabajar en Android, solo parece que aparece el siguiente error.
[INFO] : dalvikvm: Could not find method android.app.Activity.checkSelfPermission, referenced from method ti.modules.titanium.geolocation.GeolocationModule.hasLocationPermissions
[WARN] : dalvikvm: VFY: unable to resolve virtual method 32: Landroid/app/Activity;.checkSelfPermission (Ljava/lang/String;)I
[INFO] : dalvikvm: Could not find method android.app.Activity.requestPermissions, referenced from method ti.modules.titanium.geolocation.GeolocationModule.requestLocationPermissions
[WARN] : dalvikvm: VFY: unable to resolve virtual method 82: Landroid/app/Activity;.requestPermissions ([Ljava/lang/String;I)V
Mi código es el siguiente.
Ti.Geolocation.purpose = "Please allow us to find you.";
//Ti.Geolocation.showCalibration = false;
if (OS_ANDROID) {
Titanium.Geolocation.Android.LocationProvider = Ti.Geolocation.PROVIDER_GPS;
}
Ti.Geolocation.accuracy = Ti.Geolocation.ACCURACY_BEST;
Ti.Geolocation.distanceFilter = 10;
Ti.Geolocation.requestLocationPermissions(Ti.Geolocation.AUTHORIZATION_ALWAYS, function(e) {
console.log(e);
if (!e.success || e.error) {
var dialog = Ti.UI.createAlertDialog({
message : 'You do not have location permissions enabled.',
ok : 'Got it',
title : 'Important'
});
dialog.addEventListener('click', function(e) {
if (OS_IOS) {
Ti.Platform.openURL('app-settings:');
}
if (OS_ANDROID) {
var intent = Ti.Android.createIntent({
action : 'android.settings.APPLICATION_SETTINGS',
});
intent.addFlags(Ti.Android.FLAG_ACTIVITY_NEW_TASK);
Ti.Android.currentActivity.startActivity(intent);
}
});
dialog.show();
return;
}
Titanium.Geolocation.getCurrentPosition(getGeoPosition);
});
Cuando ejecuto esto, simplemente ha estado en esto durante horas, ahora tratando de depurar tan cerca de dejar de intentar todo lo que se me ocurre.
Appcelerator 5.1.2.GA
CÓDIGO COMPLETO PARA PRUEBA
function getGeoPosition(_event) {
console.log(_event);
alert(JSON.stringify(_event));
}
Ti.Geolocation.purpose = "Please allow us to find you.";
Ti.Geolocation.accuracy = Ti.Geolocation.ACCURACY_BEST;
Ti.Geolocation.distanceFilter = 10;
/**
* Event listener added in the view.
* Fired when user taps on the Ti.Geolocation button.
*/
function geolocation() {
// The new cross-platform way to check permissions
// The first argument is required on iOS and ignored on other platforms
var hasLocationPermissions = Ti.Geolocation.hasLocationPermissions(Ti.Geolocation.AUTHORIZATION_ALWAYS);
if (hasLocationPermissions) {
alert('You already have permission.');
Titanium.Geolocation.getCurrentPosition(getGeoPosition);
}
// On iOS we can get information on the reason why we might not have permission
if (OS_IOS) {
// Map constants to names
var map = {};
map[Ti.Geolocation.AUTHORIZATION_ALWAYS] = 'AUTHORIZATION_ALWAYS';
map[Ti.Geolocation.AUTHORIZATION_AUTHORIZED] = 'AUTHORIZATION_AUTHORIZED';
map[Ti.Geolocation.AUTHORIZATION_DENIED] = 'AUTHORIZATION_DENIED';
map[Ti.Geolocation.AUTHORIZATION_RESTRICTED] = 'AUTHORIZATION_RESTRICTED';
map[Ti.Geolocation.AUTHORIZATION_UNKNOWN] = 'AUTHORIZATION_UNKNOWN';
map[Ti.Geolocation.AUTHORIZATION_WHEN_IN_USE] = 'AUTHORIZATION_WHEN_IN_USE';
// Available since Ti 0.8 for iOS and Ti 4.1 for Windows
// Always returns AUTHORIZATION_UNKNOWN on iOS<4.2
var locationServicesAuthorization = Ti.Geolocation.locationServicesAuthorization;
if (locationServicesAuthorization === Ti.Geolocation.AUTHORIZATION_RESTRICTED) {
alert('Because permission are restricted by some policy which you as user cannot change, we don\'t request as that might also cause issues.');
} else if (locationServicesAuthorization === Ti.Calendar.AUTHORIZATION_DENIED) {
alert('You denied permission before');
}
}
// The new cross-platform way to request permissions
// The first argument is required on iOS and ignored on other platforms
Ti.Geolocation.requestLocationPermissions(Ti.Geolocation.AUTHORIZATION_ALWAYS, function(e) {
if (e.success) {
// Instead, probably call the same method you call if hasLocationPermissions() is true
alert('You granted permission.');
} else if (OS_ANDROID) {
alert('You denied permission for now, forever or the dialog did not show at all because it you denied forever before.');
} else {
// We already check AUTHORIZATION_DENIED earlier so we can be sure it was denied now and not before
Ti.UI.createAlertDialog({
title : 'You denied permission.',
// We also end up here if the NSLocationAlwaysUsageDescription is missing from tiapp.xml in which case e.error will say so
message : e.error
}).show();
}
});
}
geolocation();
// Handle the URL in case it resumed the app
Ti.App.addEventListener("resume", function() {
geolocation();
});
Buscando la última versión ... 5.1.0 ✓ La versión 5.1.0 ya está instalada. ? ¿Planeas desarrollar aplicaciones de Titanium? si
Checking your environment...
You have the latest Titanium SDK release 5.1.2.GA
Congrats! No issues detected for developing cross-platform mobile apps!
appc setup complete!
ACTUALIZAR GESTIÓN PARA QUE FUNCIONE PERO POR QUÉ !!!!
Ok, logré que funcionara yendo a la configuración de mis ubicaciones y apagándolos y luego volviéndolo a encender y haciendo clic en Aceptar ???? raro no puede estar bien?
Esto es tan molesto que tengo que hacer esto cada vez para que los servicios de ubicación funcionen.
Actualización, creo que una de las principales razones por las que he tenido un problema es porque estaba solicitando permisos en cada carga en el oyente de eventos de diseño posterior, esto parece solucionar el problema.
var hasLocationPermissions = Ti.Geolocation.hasLocationPermissions(Ti.Geolocation.AUTHORIZATION_ALWAYS);
if (hasLocationPermissions) {
alert('You already have permission.');
Titanium.Geolocation.getCurrentPosition(getGeoPosition);
} else {
Ti.Geolocation.requestLocationPermissions(Ti.Geolocation.AUTHORIZATION_ALWAYS, function(e) {
if (e.success) {
Titanium.Geolocation.getCurrentPosition(getGeoPosition);
} else if (OS_ANDROID) {
alert('You denied permission for now, forever or the dialog did not show at all because it you denied forever before.');
} else {
// We already check AUTHORIZATION_DENIED earlier so we can be sure it was denied now and not before
Ti.UI.createAlertDialog({
title: 'You denied permission.',
// We also end up here if the NSLocationAlwaysUsageDescription is missing from tiapp.xml in which case e.error will say so
message: e.error
}).show();
}
});
}
Todavía parece estar recibiendo todo tipo de otros problemas en los que el GPS no se activa cada vez que no lo hago y me informo con actualizaciones.