2015-11-23 57 views
32

我正在使用啓動時啓動的服務並開始檢查位置更新。一旦我拒絕位置訪問權限彈出現在感謝Android M我的服務崩潰一旦手機啓動。請求位置來自服務的權限Android M

因爲我在這種情況下,有沒有活動的呼叫requestPermissions()返回ClassCastException爲我服務Context不能轉換到活動中。

我的方法調用:

ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION); 

有沒有什麼解決方案,到目前爲止,這還是我必須撤銷該服務的權利不是在這樣的狀態下運行。

+1

在服務你可以使用** ContextCompat.checkSelfPermission()**檢查許可可用性在做一些工作之前。 –

+0

@Dhaval Patel是的問題是請求服務內的權限。似乎沒有辦法這樣做,但沒有一個活動 – stud91

+3

可能是你可以通知消息,要求用戶提供許可。 –

回答

40

您不能通過服務請求權限,因爲服務不綁定到用戶界面,這種情況是有道理的。由於服務上下文不是一項活動,因此您收到的例外是有道理的。

您可以檢查權限是否在服務中可用,並請求活動中的權限(是的,您需要一個活動)。

在服務:

public static boolean checkPermission(final Context context) { 
return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED 
     && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
} 

,並在活動:

private void showPermissionDialog() { 
    if (!LocationController.checkPermission(this)) { 
     ActivityCompat.requestPermissions(
      this, 
      new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 
      PERMISSION_LOCATION_REQUEST_CODE); 
    } 
} 
+4

@VitaliyA該服務可以檢查權限,但不要求它,因爲它沒有用戶界面。 – geNia

+0

你說得對,我的答案不是complite。 –

+2

如果您無法解決Manifest.permission.ACCESS_COARSE_LOCATION或精細位置採用Android前綴......這樣的:android.Manifest.permission.ACCESS_COARSE_LOCATION – Bartando

9

您可以通過使用應用程序上下文檢查權限沒有活動,但請求permitions,當你需要的活動。 要獲取應用程序上下文,只需撥打getApplicationContext(),並使用ContextCompat.checkSelfPermission()來檢查權限。

而且有良好的信息如何在correct way使用運行時的權限:

要檢查是否有權限,調用ContextCompat.checkSelfPermission()方法。例如,該片段 展示瞭如何檢查活動有寫權限的 日曆:

// Assume thisActivity is the current activity 
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, 
     Manifest.permission.WRITE_CALENDAR); 

如果應用許可,該方法返回PackageManager.PERMISSION_GRANTED,並且應用程序可以與 操作進行。如果應用程序沒有權限,則該方法返回 PERMISSION_DENIED,並且該應用程序必須明確詢問用戶的 權限。

編輯:您檢查服務permitions後,你需要的活動要求permition:

public static void requestPermissions (Activity activity, String[] permissions, int requestCode) 
+0

https://developer.android.com/training/permissions/requesting.html#java中的解釋顯示了請求權限如何導致onRequestPermissionsResult處理程序觸發。這是您需要攔截完成權限請求的內容。 – pollaris