我似乎无法在 Android 上使用地理位置,只是出现以下错误。
[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
我的代码如下。
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);
});
当我运行这个时,它已经过时了几个小时,现在尝试调试如此接近放弃尝试了我能想到的一切。
加速器5.1.2.GA
完整的测试代码
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();
});
查找最新版本...5.1.0 ✓
5.1.0 版本已安装。
?您打算开发 Titanium 应用程序吗?是的
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!
更新管理使其正常工作但为什么!!!
Ok so i managed to get it working by going into my locations setting and turing them off and then on again and click Agree???? weird cant be right?
这太烦人了,我每次都必须这样做才能让位置服务正常工作?
更新我认为我遇到问题的主要原因之一是因为我在帖子布局事件侦听器上的每个加载上请求权限,这似乎解决了问题。
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();
}
});
}
似乎仍然遇到各种其他问题,每次 GPS 未激活,我都会坚持这一点并报告更新。