2015-11-23 14 views
32

Tôi đang sử dụng một dịch vụ khởi động và bắt đầu kiểm tra các cập nhật vị trí. Một khi tôi từ chối truy cập vị trí trên popup cho phép bây giờ nhờ Android M dịch vụ của tôi bị treo khi điện thoại khởi động.Yêu cầu Quyền vị trí từ một dịch vụ Android M

Vì tôi không có hoạt động nào trong trường hợp này, hãy gọi tới số requestPermissions() trả về ClassCastException vì dịch vụ của tôi Context không thể truyền sang hoạt động.

Phương pháp của tôi gọi:

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

Có giải pháp nào cho đến nay để này hay tôi phải thu hồi quyền dịch vụ để không chạy trong tình trạng đó.

+1

Trong dịch vụ mà bạn có thể sử dụng ** ContextCompat.checkSelfPermission() ** để kiểm tra phòng trống phép trước khi thực hiện một số công việc. –

+0

@Dhaval Patel có vấn đề là trong yêu cầu quyền bên trong một dịch vụ. Có vẻ như không có cách nào để làm như vậy mà không có hoạt động – stud91

+3

có thể là bạn có thể kích hoạt thông báo, yêu cầu người dùng cấp quyền. –

Trả lời

40

Bạn không thể yêu cầu quyền thông qua dịch vụ vì dịch vụ không được liên kết với giao diện người dùng, điều này có ý nghĩa. Vì ngữ cảnh dịch vụ không phải là một hoạt động ngoại lệ bạn đang có ý nghĩa.

Bạn có thể kiểm tra xem sự cho phép có sẵn trong một dịch vụ hay không và yêu cầu sự cho phép trong một hoạt động (có bạn cần một hoạt động).

Trong một dịch vụ:

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

và trong một hoạt động:

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 Dịch vụ có thể kiểm tra sự cho phép, nhưng không yêu cầu, bởi vì nó không có giao diện người dùng. – geNia

+0

Bạn nói đúng, câu trả lời của tôi không phù hợp. –

+2

nếu bạn không thể giải quyết Manifest.permission.ACCESS_COARSE_LOCATION hoặc Tiền tố android sử dụng vị trí tốt ... như sau: android.Manifest.permission.ACCESS_COARSE_LOCATION – Bartando

9

Bạn có thể kiểm tra quyền mà không Hoạt động bằng cách sử dụng bối cảnh ứng dụng, nhưng bạn sẽ cần Hoạt động khi yêu cầu permitions. Để tải ngữ cảnh ứng dụng, chỉ cần gọi tới getApplicationContext() và để kiểm tra quyền sử dụng ContextCompat.checkSelfPermission().

Cũng có thông tin tốt như thế nào để sử dụng cho phép thời gian chạy trong correct way:

Để kiểm tra xem bạn có một sự cho phép, gọi phương thức ContextCompat.checkSelfPermission(). Ví dụ, đoạn mã này cho thấy làm thế nào để kiểm tra xem hoạt động này có quyền ghi vào các lịch:

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

Nếu ứng dụng có sự cho phép, phương thức trả PackageManager.PERMISSION_GRANTED, và các ứng dụng có thể tiến hành với những hoạt động . Nếu ứng dụng không có quyền, phương thức trả về PERMISSION_DENIED và ứng dụng phải yêu cầu người dùng một cách rõ ràng cho phép .

Edit: Sau khi bạn kiểm tra permitions về dịch vụ, bạn sẽ cần Hoạt động để yêu cầu permition:

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

Giải thích tại https://developer.android.com/training/permissions/requesting.html#java cho thấy cách yêu cầu các điều khoản gây ra một trình xử lý onRequestPermissionsResult để kích hoạt. Đây là những gì bạn cần để ngăn chặn hoàn thành yêu cầu quyền. – pollaris

Các vấn đề liên quan