java.lang.SecurityException:我的位置需要权限ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION

时间:2019-08-16 08:37:35

标签: android typescript gps location nativescript

我对自己的代码有疑问。

所以,我正在使用nativescript-geolocation获取我的位置。

在component.ts中,我有以下代码:

import * as geoLocation from "nativescript-geolocation";
 currentGeoLocation: any;

       ngOnInit(): void {
            geoLocation.isEnabled().then(enabled => {
                if (!enabled) {
                    geoLocation.enableLocationRequest().then(() => geoLocation.watchLocation(location => {
                        this.currentGeoLocation = location;
                        this.mapView.longitude = this.currentGeoLocation.longitude;
                        this.mapView.latitude = this.currentGeoLocation.latitude;
                        this.mapView.zoom = 15;
                        console.log(this.currentGeoLocation)
                    }, error => {
                        alert(error);
                    }, {
                            desiredAccuracy: 3,
                            updateDistance: 10,
                            minimumUpdateTime: 1000 * 1
                        }));
                } else {
                    geoLocation.watchLocation(location => {
                        this.currentGeoLocation = location;
                        this.mapView.longitude = this.currentGeoLocation.longitude;
                        this.mapView.latitude = this.currentGeoLocation.latitude;
                        this.mapView.zoom = 15;
                        console.log(this.currentGeoLocation)
                    }, error => {
                        alert(error);
                    }, {
                            desiredAccuracy: 3,
                            updateDistance: 10,
                            minimumUpdateTime: 1000 * 1
                        });
                }
            });
        }

在AndroidMainfest.xml中,我有:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

在安装应用程序时显示error

3 个答案:

答案 0 :(得分:0)

在Android M中,您需要请求运行时权限

答案 1 :(得分:0)

Android体系结构

根据Android文档:

  

Android 6.0 Marshmallow引入了新的权限模型,该模型可以   应用在运行时(而不是之前)向用户请求权限   安装。支持新模型的应用请求权限   当应用实际需要受以下内容保护的服务或数据时:   服务。尽管这并不会(有必要)改变整个应用程序   行为,确实会造成一些与敏感方式有关的变化   处理用户数据:

如果用户运行的是Android 6.0(API级别23)或更高版本,则用户在运行应用程序时必须向您的应用授予权限。 因此,您需要添加运行时权限。

import { Component, OnInit } from "@angular/core";
import * as Permissions from "nativescript-permissions";

declare var android: any;

@Component({
    selector: "ns-app",
    templateUrl: "app.component.html",
})
export class AppComponent {

    public getCameraPermission() {
        Permissions.requestPermission(android.Manifest.permission.CAMERA, "Needed for connectivity status").then(() => {
            console.log("Permission granted!");
        }).catch(() => {
            console.log("Permission is not granted (sadface)");
        });
    }

}

答案 2 :(得分:0)

  • 这里有一些简单的步骤,可以从用户那里获得运行时权限。

1)在build.gradle文件中添加以下实现。

  

实现'com.karumi:dexter:5.0.0'

2)添加以下代码,以获取用户想要的位置权限。

Dexter.withActivity(activity)
                .withPermissions(
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION)
                .withListener(new MultiplePermissionsListener() {
                    @Override
                    public void onPermissionsChecked(MultiplePermissionsReport report) {
                        Log.i(TAG, "onPermissionsChecked: ");
                        // check if all permissions are granted
                        if (report.areAllPermissionsGranted()) {
                            // All permissions are granted!

                            // Do what you want to do.

                        } else {
                            // Some permissions are not granted!
                            Toast.makeText(activity, "Permission not granted", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                        token.continuePermissionRequest();
                    }
                }).
                withErrorListener(new PermissionRequestErrorListener() {
                    @Override
                    public void onError(DexterError error) {
                    }
                })
                .onSameThread()
                .check();
  • Manifest.permission.ACCESS_FINE_LOCATION Manifest.permission.ACCESS_COARSE_LOCATION 都用于获取位置。

  • 功能:-

    if (report.areAllPermissionsGranted()) {
           // Write code to get Location.
    }
    

此功能用于检查用户是否授予权限。如果是,那么它将进入。然后编写您的代码以从用户那里获取位置。