aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
SAVED POSTS
aedev.net
  • Trang chủ
  • AI
  • Mobile
  • Flutter
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
No Result
View All Result
aedev.net
No Result
View All Result
Minh họa môi trường phát triển React Native với laptop, Android emulator và iOS simulator

Android Photo Picker: chọn ảnh bằng URI và quản lý quyền đọc đúng vòng đời

Suong Nguyen by Suong Nguyen
23/10/2026
in Lập trình Mobile
0
585
SHARES
3.2k
VIEWS
Summarize with ChatGPTShare to Facebook

Một ứng dụng chỉ cần người dùng chọn ảnh đại diện thường không cần xây màn hình duyệt toàn bộ thư viện. Android Photo Picker cho người dùng chọn ảnh cụ thể và trao quyền đọc phần dữ liệu đã chọn cho ứng dụng. Trách nhiệm tiếp theo là xử lý đúng URI được trả về và thời hạn truy cập của nó.

Bài dùng API AndroidX Activity, đối chiếu tài liệu Android ngày 23/10/2026. Tài liệu yêu cầu Activity từ 1.7.0 để dùng các contract này; đó là mốc API, không phải đề xuất cài một bản cũ bất kỳ. Chọn bản dependency phù hợp compile SDK, min SDK và các thư viện của dự án. Ví dụ chưa được build hay chạy trên thiết bị trong lượt biên tập.

Đặt luồng chọn ảnh trong Activity Result

PickVisualMedia dành cho một ảnh hoặc video. Dùng request ImageOnly khi tính năng chỉ nhận ảnh. Nếu picker không có trên thiết bị, AndroidX có cơ chế fallback sang ACTION_OPEN_DOCUMENT theo điều kiện nền tảng mà tài liệu mô tả; không cần tự suy đoán chỉ bằng một phép so sánh phiên bản Android.

Ví dụ Activity dưới đây chỉ xác nhận đã có lựa chọn. Nó không đọc file, upload hay giải mã ảnh trên main thread. Trong dự án thử, khai báo Activity tương ứng trong manifest và giữ cấu hình AndroidX đang dùng; phần package ở đầu file cần khớp ứng dụng của bạn.

package com.example.photodemo

import android.net.Uri
import android.os.Bundle
import android.widget.Button
import android.widget.LinearLayout
import android.widget.TextView
import androidx.activity.ComponentActivity
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia

class PhotoActivity : ComponentActivity() {
    private var selectedUri: Uri? = null
    private lateinit var status: TextView

    private val pickPhoto = registerForActivityResult(PickVisualMedia()) { uri ->
        if (uri != null) {
            selectedUri = uri
            status.text = "Da chon anh"
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        status = TextView(this).apply { text = "Chua chon anh" }
        val choose = Button(this).apply {
            text = "Chon anh"
            setOnClickListener {
                pickPhoto.launch(PickVisualMediaRequest(PickVisualMedia.ImageOnly))
            }
        }
        setContentView(LinearLayout(this).apply {
            orientation = LinearLayout.VERTICAL
            addView(status)
            addView(choose)
        })
    }
}

Launcher được đăng ký nhất quán khi Activity được tạo, thay vì tạo mới bên trong mỗi lần bấm nút. Khi người dùng hủy và callback nhận null, ví dụ giữ nguyên lựa chọn trước đó. Nếu sản phẩm muốn nút “xóa ảnh”, hãy triển khai thao tác riêng để việc hủy picker không vô tình xóa state.

URI là định danh để truy cập, không phải đường dẫn file

Không lấy một đoạn trong chuỗi URI rồi dùng nó như đường dẫn filesystem. Ảnh có thể đến từ provider và có thể cần tải từ nguồn cloud. Dùng ContentResolver hoặc thư viện hiển thị ảnh hỗ trợ URI, xử lý lỗi đọc và đóng stream bằng cơ chế quản lý tài nguyên phù hợp.

Khi bổ sung upload, đọc và xử lý dữ liệu ở luồng làm việc phù hợp, giới hạn kích thước và kiểm tra loại dữ liệu mà backend chấp nhận. Việc picker lọc ảnh không thay cho kiểm tra file tại nơi nhận upload. Tránh ghi URI và metadata ảnh của người dùng vào log chỉ để chứng minh callback có chạy.

Ví dụ lưu selectedUri trong field để giữ bài tập ngắn. Field đó không tồn tại qua process death và không phải cách khôi phục state hoàn chỉnh. Ứng dụng thật cần quyết định dữ liệu nào giữ bằng SavedState hay bộ lưu trữ của tác vụ, rồi khôi phục giao diện và xử lý URI không còn đọc được.

Upload nền cần xem lại thời hạn quyền

Theo tài liệu Photo Picker, quyền đọc mặc định có thể kết thúc khi ứng dụng dừng hoặc thiết bị khởi động lại. Với công việc kéo dài, ví dụ upload nền, tài liệu hướng dẫn giữ quyền bằng lời gọi sau trong ngữ cảnh có context và URI thực sự được cấp:

val flags = android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION
context.contentResolver.takePersistableUriPermission(uri, flags)

Chỉ lưu chuỗi URI vào database không giữ quyền truy cập. Ngược lại, giữ được quyền cũng không có nghĩa ảnh chắc chắn tồn tại mãi. Tác vụ cần xử lý lỗi quyền hoặc nguồn dữ liệu biến mất, cho phép người dùng chọn lại và giải phóng grant khi ứng dụng không còn sử dụng, sau khi xét các tác vụ khác còn tham chiếu cùng URI.

Lời gọi giữ quyền có thể thất bại; xử lý lỗi phù hợp thay vì luôn đánh dấu tác vụ sẵn sàng. Với ảnh chỉ dùng ngay để preview, đừng tự tạo yêu cầu giữ quyền dài hạn nếu sản phẩm không cần.

Ma trận kiểm tra trước khi release

Thử chọn một ảnh, hủy khi chưa có lựa chọn, hủy sau khi đã chọn và chọn ảnh mới thay ảnh cũ. Sau đó kiểm tra xoay màn hình, ứng dụng bị hệ thống tạo lại, ảnh từ cloud và lỗi trong lúc đọc dữ liệu. Nếu hỗ trợ upload nền, thử cả khởi động lại ứng dụng hoặc thiết bị theo vòng đời được thiết kế.

Ghi rõ thiết bị nào dùng picker hệ thống và thiết bị nào dùng fallback. Riêng luồng chọn ảnh này chỉ yêu cầu quyền với nội dung người dùng chọn; các tính năng đọc thư viện khác của cùng ứng dụng phải được đánh giá riêng. Đừng suy ra một lần chọn thành công cho phép ứng dụng đọc mọi ảnh.

Kết luận

Photo Picker giúp thu hẹp phạm vi dữ liệu mà người dùng chia sẻ. Luồng đáng tin cậy còn cần xử lý hủy chọn, đọc qua URI, khôi phục state và giữ quyền đúng khi chuyển công việc sang nền. Đây là những ca nên kiểm tra trực tiếp trên thiết bị trước khi phát hành.

Nguồn tham khảo

  • Android Developers: Photo Picker và Activity Result contracts
  • Android Developers: ContentResolver

Tags: AndroidPermissionsPhoto Picker
SummarizeShare234
Suong Nguyen

Suong Nguyen

Related Stories

Minh hoạ điều hướng giữa các màn hình trong React Native bằng stack và tab

Deep link mobile an toàn: đúng domain chưa đủ, còn route và quyền đọc

by Suong Nguyen
22/10/2026
0

Tách xác minh domain, phân tích route và kiểm tra quyền để link mở đúng màn hình mà không tự cấp quyền truy cập dữ liệu.

Minh hoạ React Native gọi API và hiển thị loading error empty success state

Thiết kế offline-first cho app mobile: bắt đầu từ trạng thái dữ liệu

by Suong Nguyen
21/10/2026
0

Phân biệt mất mạng, dữ liệu cũ và thao tác chưa đồng bộ để thiết kế một ứng dụng mobile có thể sử dụng trong điều kiện kết...

Minh họa ứng dụng React Native kết nối nhiều SDK như analytics, maps, authentication, payment và push notification

Tích hợp SDK trong React Native: quy trình thực chiến từ cài đặt đến release

by admin
28/08/2026
2

Hướng dẫn tích hợp SDK trong React Native: cấu hình Android, iOS, API key, permission, adapter, Analytics, Crashlytics, Maps, Payment, Auth và checklist release.

Minh họa Firebase Cloud Messaging gửi push notification tới ứng dụng React Native trên Android và iOS

Hướng dẫn tích hợp Firebase Cloud Messaging (FCM) vào React Native từ A-Z

by admin
02/08/2026
0

Hướng dẫn tích hợp Firebase Cloud Messaging vào React Native từ A-Z: Android, iOS/APNs, quyền notification, FCM token, foreground, background và backend.

Next Post
Lập trình viên chuẩn bị phỏng vấn fresher React Native với laptop, điện thoại và thẻ câu hỏi

Phỏng vấn JavaScript: vì sao spread vẫn có thể làm đổi object gốc?

0 0 votes
Article Rating
Subscribe
Login
Notify of
guest
guest
0 Comments
Oldest
Newest Most Voted
AE Dev

AE Dev mang đến các bài viết về lập trình, mobile app, backend, frontend, WordPress và công nghệ, phù hợp cho developer muốn học hỏi và cập nhật kiến thức thực tế.

Recent Posts

  • React Native: làm nút icon dễ sử dụng với VoiceOver và TalkBack
  • Phỏng vấn JavaScript: vì sao spread vẫn có thể làm đổi object gốc?
  • Android Photo Picker: chọn ảnh bằng URI và quản lý quyền đọc đúng vòng đời

Categories

  • AI
  • Backend
  • Đánh giá
  • DevOps
  • Flutter
  • Hướng dẫn
  • Lập trình Mobile
  • Phỏng vấn
  • React Native
  • Uncategorized

Weekly Newsletter

  • Buy JNews
  • Support Forum
  • Pre-sale Question
  • Contact Us

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Trang chủ
  • AI
  • Mobile
  • React Native
  • Backend
  • DevOps
  • Hướng dẫn
  • Flutter

© 2026 AE Dev - Blog công nghệ, lập trình và chia sẻ kiến thức IT.

wpDiscuz
0
0
Would love your thoughts, please comment.x
()
x
| Reply