简体   繁体   English

Android:java.lang.SecurityException

[英]Android: java.lang.SecurityException

Am trying to fetch latitude and longitude in the service class by using network provider.Giving all the permission in the manifest 我试图通过使用网络提供程序获取服务类中的纬度和经度。

  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

But when I try to run the application am getting an security exception 但是当我尝试运行该应用程序时,出现了安全异常

java.lang.RuntimeException: Unable to create service test.alaramservicedemo.GPSTracker: java.lang.SecurityException: "network" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission.

GPSTracker.java GPSTracker.java

public class GPSTracker extends Service implements LocationListener {

private static final String TAG = "HelloService";

private boolean isRunning  = false;
protected LocationManager locationManager;
String latitude = "";
String longitude="";
@Override
public void onCreate() {
    Log.i(TAG, "Service onCreate");
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
    isRunning = true;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i(TAG, "Service onStartCommand");

    new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                }

                if(isRunning){
                    Log.i(TAG, "Service running latitude "+latitude + " longitude " +longitude);
                }
            }

            stopSelf();
        }
    }).start();

    return Service.START_STICKY;
}


@Override
public IBinder onBind(Intent arg0) {
    Log.i(TAG, "Service onBind");
    return null;
}

@Override
public void onDestroy() {

    isRunning = false;

    Log.i(TAG, "Service onDestroy");
}

@Override
public void onLocationChanged(Location location) {
    latitude = ""+location.getLatitude();
    longitude = ""+location.getLongitude();

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}

} }

The GPSTracker is calling form the onReceive() method from BroadcastReciver GPSTracker正在从BroadcastReciver的onReceive()方法调用

 Intent i = new Intent(context, GPSTracker.class);
    context.startService(i);

Manifest.xml Manifest.xml

<?xml version="1.0" encoding="utf-8"?>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <receiver android:name=".AlarmReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

    <!-- Will not be called unless the application explicitly enables it -->
    <receiver android:name=".DeviceBootReceiver"
        android:enabled="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED"/>
        </intent-filter>
    </receiver>

    <service android:name=".GPSTracker"/>
</application>

I don't know why even am giving the permission in Manfiest why am getting security exception. 我不知道为什么甚至要在Manfiest中授予许可,为什么还要获得安全例外。

Can any one please help to find out the issue 谁能帮忙找出问题所在

Write your permission outside application tag. 在应用程序标签之外写您的许可。 Like this: 像这样:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity
                android:name=".xxxxx"
                android:screenOrientation="portrait"
                android:label="@string/app_name"
                android:theme="@style/AppTheme.NoActionBar">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

Use : 采用 :

 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

Instead of : 代替 :

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

If you are calling the service a GPSTracker. 如果您将该服务称为GPSTracker。

Try following permission 尝试获得许可

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

also apply following 也适用以下

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

it may be solve your problem. 它可能是解决您的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM