2015-07-19 24 views

Trả lời

4

Không, không thể. Những gì bạn có thể làm là gửi thông báo nơi người dùng có thể nhấn và sau đó sử dụng hoạt động để yêu cầu/quản lý quyền (có thể với chủ đề của hộp thoại).

+1

Hoạt động cấu hình cũng là một nơi tốt để giải quyết vấn đề này. Mặc dù người dùng có thể truy cập màn hình quyền và thu hồi bất kỳ quyền nào đã cho trước đó, vì vậy phương pháp tiếp cận thông báo vẫn cần thiết. Tôi cũng xem xét việc đưa tiện ích vào trạng thái giao diện người dùng bị thu hồi quyền là một cách tiếp cận thay thế. –

1

Bạn chỉ có thể yêu cầu quyền từ Hoạt động hoặc từ phân đoạn.

Tìm ra một điểm trong Hoạt động hoặc Phân đoạn của bạn, nơi bạn cảm thấy ứng dụng sẽ yêu cầu quyền, sau đó gọi requestPermission method. gửi thông báo sẽ không hoạt động vì bạn muốn xử lý mã của bạn cho đến khi bạn nhận được các quyền được yêu cầu, và sau đó tiếp tục chức năng của bạn từ phương thức onRequestPermissionResult().

4

Tôi nghĩ rằng nó có thể yêu cầu sự cho phép bên ngoài của một hoạt động, miễn là bạn sử dụng phương pháp

ActivityCompat.requestPermissions (Activity activity, String[] permissions, int requestCode)

từ thư viện hỗ trợ và vượt qua Hoạt động như một tham số của phương pháp.

Ví dụ:

ActivityCompat.requestPermissions(targetActivity, new String[] {Manifest.permission.CAMERA}, PERMISSION_REQUEST_CODE); 

nơi targetActivity là Hoạt động rằng nên thực hiện phương pháp này:

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults)

Đó là phương pháp mà sẽ xử lý kết quả yêu cầu sự cho phép de.

+16

Ngoài hoạt động có nghĩa là từ một Dịch vụ hoặc một BroadcastReceiver, nơi bạn không có Hoạt động nào cả. Câu trả lời này không giúp gì cả. –

+0

Nói chung, bạn có thể chuyển đối tượng ngữ cảnh đến một lớp không hoạt động và sử dụng nó khi cần bối cảnh và bạn không có hoạt động. Yêu cầu quyền là một câu chuyện khác nhau mặc dù. – Pedram

+0

@Gabe ở một bên bạn là chính xác, nhưng ở phía bên kia, câu hỏi không chỉ ra từ nơi người hỏi muốn gọi yêu cầu. Vì vậy, tôi nghĩ rằng đây là một câu trả lời đúng. – Opiatefuchs

8

Nếu bạn muốn yêu cầu sự cho phép từ bên ngoài hoạt động, bạn có thể tạo lớp khác và mở rộng lớp học từ Hoạt động. Sử dụng constructer để lấy và thiết lập Context cho lớp.

public class Permissions extends Activity { 

private static final int MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE = 1; 
private Context context; 

public Permissions(Context context) { 
    this.context = context; 
} 
public void checkWriteExternalStoragePermission() { 
    final int MY_PERMISSIONS_REQUEST_PHONE_CALL = 1; 
    ContextCompat.checkSelfPermission(context,  Manifest.permission.WRITE_EXTERNAL_STORAGE); 
    if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions((Activity) context, 
       new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
       MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 

     case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: { 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(context, "Permission Denied", Toast.LENGTH_SHORT).show(); 
      } 
      return; 

     } 
     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 
} 

Bây giờ, hãy tạo đối tượng và chuyển ngữ cảnh đến hàm tạo bất cứ khi nào bạn cần yêu cầu quyền.

Permissions permissions = new Permissions(SplashScreen.this); 
    permissions.checkWriteExternalStoragePermission(); 
+3

Tuy nhiên, có nhược điểm đối với phương pháp này là đối tượng có thể giữ tham chiếu về ngữ cảnh Hoạt động ngay cả sau khi hoạt động bị hủy, điều này có thể dẫn đến rò rỉ bộ nhớ. –

+6

Đây là gian lận. Mã của bạn không thực sự sử dụng thực tế là Quyền là một Hoạt động, vì bạn không chuyển nó tới requestPermissions(). Nếu bạn đã làm, nó sẽ thất bại. Thay vào đó, bạn chuyển Context cho requestPermissions(), giả định rằng nó là một Activity. Nhưng điểm của câu hỏi là, phải làm gì nếu không có Hoạt động nào cả? – Lev

+7

Chỉ là một cảnh báo cho những người không biết rõ hơn, không sử dụng mã này! –

-1

Có thể gọi requestPermissions() từ bên ngoài hoạt động của bạn, nhưng trong lớp học, bạn nên có bối cảnh của hoạt động đó.

ActivityCompat.requestPermissions((Activity)context, new String[]{permission.READ_PHONE_STATE}, REQUEST_CODE); 

Để làm việc, bạn nên thực hiện dưới phương pháp trong hoạt động của bạn

onRequestPermissionsResult (int requestCode, String[] permissions, int[] grantResults) 

Vì vậy mà phương pháp ghi đè này được thực hiện khi người dùng máy trên cho phép hoặc nút từ chối trên cửa sổ pop up

0

Bạn có thể sử dụng thư viện Easy Permissions.

Android yêu cầu các yêu cầu này đến từ một số Activity. Với Quyền dễ dàng, điều này không còn là vấn đề nữa, bạn có thể yêu cầu sự cho phép từ bất cứ đâu miễn là bạn cung cấp Context. Ngoài ra, nếu bạn yêu cầu quyền đã được cấp thì người dùng sẽ không được nhắc.

enter image description here

tiết lộ đầy đủ, công ty chúng tôi quản lý và phát triển này miễn phí để sử dụng thư viện. Điều đó đang được nói, chúng tôi tự tin rằng nó là một công cụ hữu ích và chúng tôi sẽ không chia sẻ nó nếu không.

+0

Điều này không có ý nghĩa với tôi. Nếu Android thực sự có yêu cầu sử dụng một hoạt động để yêu cầu quyền, thư viện của bạn phải là ma thuật thuần túy bởi vì nó có thể làm điều không thể. Sự thật là bạn sử dụng một ngữ cảnh. Đó là giống như checkSelfPermission tiêu chuẩn(). Tôi không thể thấy lợi thế thực sự khi sử dụng thư viện của bên thứ ba để kiểm tra quyền này. Có lẽ tôi nhớ điều gì đó ... –

+0

@TheincredibleJan Cảm ơn bạn đã liên hệ. Android yêu cầu 'Hoạt động'. 'Context' là cần thiết cho thư viện, giống như nhiều thư viện - nó là ma thuật nhưng nó vẫn dựa trên thế giới thực :). Ưu điểm lớn nhất là bạn có thể yêu cầu bật quyền từ bất kỳ nơi nào, ngay cả một lớp không phải là 'Hoạt động'. Ngoài ra, phiên bản mới nhất sẽ cho phép bạn tự động kích hoạt tất cả các quyền trong tệp 'Tệp kê khai 'của bạn. Có một ứng dụng mẫu trên trang GitHub; nếu bạn có một vài phút, bạn chắc chắn nên kiểm tra xem nó ra. Vui lòng cho chúng tôi biết nếu bạn có thêm bất kỳ câu hỏi nào. –

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