【问题标题】:Android: java.lang.SecurityException安卓:java.lang.SecurityException
【发布时间】:2016-04-08 08:48:28
【问题描述】:

我正在尝试使用网络提供商获取服务类中的纬度和经度。在清单中授予所有权限

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

但是当我尝试运行应用程序时遇到安全异常

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

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

}

}

GPSTracker 正在从 BroadcastReciver 调用 onReceive() 方法

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

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>

我什至不知道为什么在 Manfiest 中给予许可为什么会出现安全异常。

谁能帮忙解决一下问题

【问题讨论】:

  • 你在棉花糖中测试这个吗?
  • 不,我在 Kitkat @Vivek Mishra 跑步
  • 那么你使用的是android studio 2 及以上的即时运行功能吗?
  • 能分享一下AndroidManifest.xml吗?
  • 权限超出&lt;application&gt; 标签。

标签: java android service android-gps


【解决方案1】:

在应用标签之外写下你的权限。像这样:

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

【讨论】:

    【解决方案2】:

    尝试以下权限

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

    也适用于以下

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

    或许能解决你的问题。

    【讨论】:

    • 我试过了,但还是同样的问题@Dhavalkumar Solanki
    【解决方案3】:

    使用:

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

    而不是:

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

    如果您将该服务称为 GPSTracker。

    【讨论】:

    • 我在 Kitkat @Enpi 中运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2017-12-05
    • 2012-04-08
    • 2012-10-09
    相关资源
    最近更新 更多