6

Câu hỏi trắc nghiệm:Cách ĐỪNG kiểm tra quyền Android động

Điều nào sau đây sẽ kiểm tra chính xác xem ứng dụng có quyền nhất định được khai báo trong AndroidManifest.xml của họ hay không?

getContext().checkCallingOrSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 

hoặc

getContext().getPackageManager().checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE, getContext().getPackageName()) == PackageManager.PERMISSION_GRANTED 

Về cơ bản, tôi đã sợ hãi từ tài liệu android về những gì checkCallingOrSelfPermission tuyên bố -> nó trao một quyền IPC nếu bạn chỉ cần kiểm tra cho nó ?? điều đó có nghĩa là gì? http://developer.android.com/reference/android/content/Context.html#checkCallingOrSelfPermission(java.lang.String)

Vì vậy, bất kỳ lời giải thích về sự khác biệt thực sự sẽ là tuyệt vời: D

* lưu ý: Tôi cho mã này trong thư viện, do đó, tôi đang chỉ được phép kiểm tra quyền trong thời gian chạy, trừ khi bạn biết một cách tốt hơn.

Trả lời

3

Bạn có thể sử dụng phương pháp này:

//for example, permission can be "android.permission.WRITE_EXTERNAL_STORAGE" 
public boolean hasPermission(String permission) 
{ 
    try { 
     PackageInfo info = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS); 
     if (info.requestedPermissions != null) { 
      for (String p : info.requestedPermissions) { 
       if (p.equals(permission)) { 
        return true; 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 
+0

này ban đầu được câu trả lời của tôi cho [câu hỏi này] (http://stackoverflow.com/questions/18236801/programmatically-retrieve-permissions-from-manifest-xml-in-android/18237962 # 18237962). – Phil

4

Từ hiểu biết của tôi (mà có thể là sai, như tôi đã không làm việc nhiều với IPC, chưa):

Cho rằng mã của bạn được thực hiện từ một ứng dụng (ví dụ: thư viện của bạn không được biên dịch vào ứng dụng, nhưng được tiếp xúc với bên thứ ba bằng cách sử dụng Binder hoặc thứ gì đó tương tự), bạn có thể sử dụng checkCallingPermission để kiểm tra xem ứng dụng của bên thứ ba có được cấp quyền hay không, trong khi checkCallingOrSelfPermission bao gồm các quyền từ ứng dụng của bạn thư viện đã được biên soạn vào.

Bạn cần xử lý quyền của người gọi một cách riêng biệt vì bạn có thể bị rò rỉ quyền đối với các ứng dụng khác khi kiểm tra quyền của riêng mình. Từ số security tips:

Không bị rò rỉ dữ liệu được bảo vệ quyền. Điều này xảy ra khi ứng dụng của bạn hiển thị dữ liệu qua IPC chỉ khả dụng bởi vì nó có quyền cụ thể là , nhưng không yêu cầu sự cho phép của bất kỳ ứng dụng khách nào của đó là giao diện IPC.

[...]

Nếu cung cấp một giao diện mà không cần kiểm soát truy cập, sử dụng checkCallingPermission() để xác minh xem người gọi có cần phép. Điều này đặc biệt quan trọng trước khi truy cập dịch vụ trên số điện thoại thay mặt cho người gọi, vì việc xác định đơn đăng ký của bạn được chuyển đến các giao diện khác.

Cách trình quản lý gói bạn mô tả séc chỉ quyền của ứng dụng mà thư viện của bạn được biên dịch.

Vì vậy, nếu mã của bạn không được thực hiện từ một quy trình khác, bạn có thể không phải quan tâm đến sự khác biệt. Khác, sử dụng cách quản lý gói hoặc clear the calling identity stuff nếu bạn quan tâm đến việc liệu bạn có thể thực hiện một tác vụ hay không; kiểm tra thêm quyền của người gọi nếu bạn muốn kiểm tra xem có phải quy trình gọi cũng có thể thực hiện tác vụ hay không.

0

Bạn có thể sử dụng chức năng Context.checkCallingorSelfPermission() cho việc này. Dưới đây là một ví dụ

private boolean checkWriteExternalPermission() 
{ 

    String permission = "android.permission.WRITE_EXTERNAL_STORAGE"; 
    int res = getContext().checkCallingOrSelfPermission(permission); 
    return (res == PackageManager.PERMISSION_GRANTED);    
} 
Các vấn đề liên quan