Appcelerator Could not find method android.app.Activity.checkSelfPermission

假装没事ソ 提交于 2019-12-04 05:53:25

问题


I cant seem to get geo location to work on Android just seem to get the following bug.

[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

My code is as follows.

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);

});

When i run this it just stales been at this for hours now trying to debug so close to just giving up tried everything i can think of.

Appcelerator 5.1.2.GA

FULL CODE TO TEST

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();
});

Finding latest version ...5.1.0 ✓ Version 5.1.0 already installed. ? Do you plan on developing Titanium apps? Yes

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!

UPDATE MANAGE TO GET IT WORKING BUT WHY!!!!

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?

This is soooo annoying i have to do this everytime to get the locations services to work?

Update i think one of the main reasons i have been getting a issue is because i was requesting permissions on every load on the post layout event listener this seems to fix the issue.

 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();
         }
     });

 }

Still seem to be getting all sorts of other issues where GPS isnt activate each time ill keep at this and report back with updates.

来源:https://stackoverflow.com/questions/35229521/appcelerator-could-not-find-method-android-app-activity-checkselfpermission

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!