2016-04-21 163 views
-1

我面临的问题是通过我写的服务为应用程序授予gps权限。 我试图找到一个例子来实现这一点,例子显示在Activity中写一个gpslocation finder,但在这种情况下,我想实现这个服务。requestPermissions()为服务中的gps。错误:“位置提供程序需要ACCESS_FINE_LOCATION权限。”

服务代码如下:

public class TravelService extends Service{ 

    private LocationManager locManager; 
    private LocationListener locListener; 


    @Override 
    public void onCreate() { 
     super.onCreate(); 
     locManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     locListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       locManager.requestLocationUpdates("gps", 5000, 100, locListener); 

      } 

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

      } 

      @Override 
      public void onProviderEnabled(String provider) { 

      } 

      @Override 
      public void onProviderDisabled(String provider) { 

      } 
     }; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

       // TODO: Consider calling 
       // ActivityCompat#requestPermissions 
       // here to request the missing permissions, and then overriding 
       // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
       //           int[] grantResults) 
       // to handle the case where the user grants the permission. See the documentation 
       // for ActivityCompat#requestPermissions for more details. 
       return; 
      } 
      locManager.requestLocationUpdates("gps", 5000, 100, locListener); 

      Toast.makeText(this, "Service Created", Toast.LENGTH_LONG).show(); 
     } 
    } 
    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     locManager.requestLocationUpdates("gps", 5000, 100, locListener); 

     Toast.makeText(this,"Service Started",Toast.LENGTH_LONG).show(); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this,"Service destroyed",Toast.LENGTH_LONG).show(); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

} 

这是我在manifest.xml代码:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.param.dateandtime"> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_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=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <!-- Entry for LoginActivity.class --> 
     <activity android:name=".LoginActivity" 
      android:label="@string/app_name"></activity> 
     <activity android:name=".Finish" 
      android:label="@string/app_name"></activity> 
     <service android:name=".TravelService" 
      android:exported="false"/> 
    </application> 

</manifest> 

这里我附上错误日志,显示我面对错误。我可以将错误视为“位置提供者需要ACCESS_FINE_LOCATION权限”。 Error log:

+1

Stack Overflow是编程问题。你的问题是什么? – CommonsWare

+0

发布您的清单 –

+0

我发布了我的manifest.xml代码 –

回答

0

由于服务不绑定到UI,因此无法从服务请求权限。 所以请从startService()的活动中进行。

ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number can be used 

并实行onRequestPermissionsResult()回调

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     switch (requestCode) { 
      case 1001: { 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED 
         && (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
         || ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { 
        //Start your service here 
       } 
      } 
     } 
    } 
+0

我正在检查权限onCreate()它是否正确。所以,通过该服务运行它应该有权限。但我想要的是如何在服务中的onCreate()方法中提供权限。 –

+0

我以为你知道如何做到这一点,但你注释掉了代码并发布了它。更新了答案。 –

+0

当我在服务中使用ActivityCompat.requestPermissions()时,它期待第一个参数作为一个活动并显示如下错误:https://lh6.googleusercontent.com/-iV4t1YB_hZU/Vxpow_fqGxI/AAAAAAAAEQU/3Wzup0D-02o7ys00VopOYg4ov9v1SfsOwCL0B/w739- h229-no/error1.png –