Cách xin Permission trên Android Marshmallow 6.0 khi runtime

Ở bài 22 hướng dẫn về cấp quyền trong lập trình android căn bản mình đã nó qua cho các bạn các quyền cơ bản nhất rồi đúng không nào, và trong đó có một loại quyền là Permission nguy hiểm thì quyền này bắt buộc chúng ta phải xin cả ở AndroidManifest và cả trong lúc ứng dụng khởi chạy (runtime).

Trước tiên các bạn xem lại các quyền nào thuộc quyền nguy hiểm để các bạn xin cấp quyền khi run time nhé chứ những quyền bình thường thì không cần thiết phải xin đâu.

Permisson nguy hiểm trong android

Permission nguy hiểm trong android

 

Và những quyền này bạn chỉ cần xin cấp phát 1 lần duy nhất thôi và từ đó về sau ứng dụng sẽ không xin thêm một lần nào nữa , và hôm nay chúng ta sẽ làm một ví dụ như sau để demo nhé:

Tạo một ứng dụng tải ảnh trên mạng về và sau đó lưu vào trong thư mục thư viện hay tiếng anh là Gallery và đồng thời hiển thị ảnh đó lên ImageView luôn. Ở đây khi bạn lưu ảnh vào điện thoại thì bạn bắt buộc phải xin quyền ghi file đó là : android.permission.WRITE_EXTERNAL_STORAGE, mà quyền này nằm trong danh mục quyền nguy hiểm nên ta sẽ xin trong file AndroidManifest và cả khi ứng dụng đang run time.

Ngoài ra còn phải xin thêm quyền kết nối tới internet nữa nên bạn sẽ khai báo thêm quyền android.permission.INTERNET, đây là quyền bình thường không phải quyền nguy hiểm nhé mọi người.

Đây là ứng dụng sau khi mình hoàn thành:

Ứng dụng tải hình ảnh trên android về điện thoại

Ứng dụng tải hình ảnh trên android về điện thoại

Khi bật app nó sẽ hỏi quyền bạn như thế này , và sau đó thì bạn mới có quyền ghi file được:

Xin cấp quyền trên android 6.0 Marshmallow

Xin cấp quyền trên android 6.0 Marshmallow

Chúng ta bắt đầu bắt tay vào làm thôi nào!

Dưới đây là cấu hình config file AndroidManifest.xml nhé:

AndroidManifest.xml


Tiếp đến là file layout bạn mình sẽ một EditText để điền link vào ,một Button để click vào sẽ download hình ảnh đó về lưu lại trong Gallery thiết bị đồng thời hiển thị lên ImageView trên màn hình luôn, code layout như sau:

activity_main.xml


***  Ở trên mình dùng một hình ảnh trong Imageview là thangcoder_image, bạn có thể xoá nó đi chứ không lỗi nếu như bạn không tải project về mà tự code tay nhé.

Bạn nhớ thêm chuỗi string này vào file strings.xml trong thư mục value -> strings.xml nhé:

strings.xml


Và đây là toàn bộ code mình xử lý trong MainActivity và cũng chính nội dung bài viết nằm ở đây:

MainActivity.java


Mình sẽ không giải thích hết code bên trong mà chỉ dừng lại ở đoạn xin cấp quyền và trong bài viết khác mình sẽ hướng dẫn chi tiết phần này sau nhé, đoạn code xin cấp quyền ghi file là đây:


Nếu như bạn xoá đoạn code này thì vẫn chạy được trên android 5.0 trở xuống nhé, chỉ 6.0 mới lỗi thôi.


Đoạn trên là để kiểm tra xem phiên bản android thiết bị hiện có lớn hơn hoặc bằng android 6.0, M ở đây có nghĩa là Marshmallow, nếu đúng thì sẽ tiến hành kiểm tra xem trong file AndroidManifest.xml có khai báo quyền READ_EXTERNAL_STORAGE, nếu có thì tiến hành yêu cầu cung cấp quyền này.

Đây là hàm check:


Còn đây là hàm yêu cầu cung cấp quyền :


Ở đoạn lênh này có thể có hay không cũng chẳng sao cả nhé, nhưng nên thêm vào để xử lý chứ có thể xảy ra lỗi:


Đoạn code trên kiểm tra xem thiết bị này đã từng từ chối quyền ghi file trên ứng dụng này chưa, có nghĩa là ứng dụng này từng xin cấp quyền đọc ghi file nhưng người dùng đã từ chối thì nó sẽ trả về true khi gọi hàm :


Và sẽ trả về false nếu như người dùng từng từ chối quyền và tick chọn không hiển thị lại lần sau, bạn xem ảnh dưới đây sẽ hiểu

Từ chối quyền và không cho hiện thông báo lần sau

Từ chối quyền và không cho hiện thông báo lần sau

Nếu người dùng chọn Never ask again rồi Denny, thì lần sau ứng dụng sẽ không được xin quyền nữa đâu nhé, còn nếu người dùng Allow thì ứng dụng được cấp quyền và lần sau sẽ không hỏi nữa.

Ở phía trên còn một đoạn code như sau:


Đây là phương thức lắng nghe xem khi hiển thông dialog thông báo xin quyền thì người dùng click vào đâu, nếu như người dùng chọn Allow thì nó sẽ vào hàm này:


Ngược lại nếu chọn Denny thì nó sẽ vào hàm else còn lại:


Thực ra thằng này không cần thiết nên bạn có thể không cần @Override nó làm gì cả.Và đây là source code của ứng dụng bạn có thể tải nó xuống ở link github phía dưới và nếu chỗ nào không hiểu thì xem qua video nhé.

Mời bạn tải về project ở link bên dưới!

Chúc các bạn thành công!

Cách xin Permission trên Android Marshmallow 6.0 khi runtime
3 (60%) 3 votes

4 Comments

  1. beut April 27, 2017
  2. red_devils May 30, 2017
  3. mr.Hung June 18, 2017
  4. Francis July 26, 2017

Add Comment

*