Khai báo nhu cầu về chế độ hiển thị gói

Khi tạo ứng dụng, bạn cần phải xem xét các ứng dụng khác trên thiết bị mà ứng dụng của bạn cần tương tác. Nếu ứng dụng nhắm đến Android 11 (API cấp 30) trở lên, thì hệ thống sẽ tự động hiển thị một số ứng dụng với ứng dụng của bạn, nhưng sẽ lọc ra các ứng dụng khác theo mặc định. Hướng dẫn này mô tả cách hiển thị các ứng dụng khác này với ứng dụng của bạn.

Nếu ứng dụng của bạn nhắm đến Android 11 trở lên và cần tương tác với các ứng dụng không phải là ứng dụng tự động hiển thị, hãy thêm phần tử <queries> vào tệp kê khai của ứng dụng. Trong phần tử <queries>, hãy chỉ định các ứng dụng khác theo tên gói, theo chữ ký ý định, hoặc theo thẩm quyền của trình cung cấp, như mô tả trong các phần sau.

Tên gói cụ thể

Nếu bạn biết nhóm ứng dụng cụ thể mà mình muốn truy vấn hoặc tương tác, chẳng hạn như các ứng dụng tích hợp với ứng dụng của bạn hoặc các ứng dụng có dịch vụ mà bạn dùng, hãy thêm tên gói của các ứng dụng đó vào một tập hợp phần tử <package> bên trong phần tử <queries>:

<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>

Kết nối với một ứng dụng lưu trữ trong thư viện

Nếu phát triển thư viện Android, bạn có thể khai báo nhu cầu về chế độ hiển thị gói của mình bằng cách thêm phần tử <queries> vào tệp kê khai AAR. Phần tử <queries> này có chức năng giống như phần tử mà các ứng dụng có thể khai báo trong tệp kê khai riêng.

Nếu thư viện của bạn có kết nối với một ứng dụng lưu trữ, chẳng hạn như sử dụng dịch vụ ràng buộc, hãy thêm một phần tử <package> chỉ định tên gói của ứng dụng lưu trữ đó:

<!-- Place inside the <queries> element. -->
<package android:name=PACKAGE_NAME />

Khi thêm nội dung khai báo này, bạn có thể kiểm tra xem ứng dụng lưu trữ có được cài đặt và tương tác với thư viện đó hay không, chẳng hạn như bằng cách gọi bindService(). Ứng dụng gọi sử dụng thư viện của bạn sẽ tự động hiển thị với ứng dụng lưu trữ do hoạt động tương tác này.

Các gói khớp với chữ ký bộ lọc ý định

Ứng dụng của bạn có thể cần truy vấn hoặc tương tác với một nhóm ứng dụng phục vụ mục đích cụ thể, nhưng bạn có thể chưa biết tên gói cụ thể sẽ đưa vào. Trong trường hợp này, bạn có thể liệt kê chữ ký bộ lọc ý định trong phần tử <queries>. Sau đó ứng dụng của bạn có thể khám phá các ứng dụng có phần tử <intent-filter> trùng khớp.

Mã ví dụ sau đây cho thấy một phần tử <intent> cho phép ứng dụng xem các ứng dụng khác đã cài đặt có hỗ trợ tính năng chia sẻ hình ảnh JPEG:

<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>

Phần tử <intent> có một số hạn chế như sau:

  • Bạn phải thêm đúng một phần tử <action>.
  • Bạn không thể dùng thuộc tính path, pathPrefix, pathPattern hoặc port trong phần tử <data>. Hệ thống sẽ hoạt động như thể bạn đặt giá trị của mỗi thuộc tính thành ký tự đại diện chung (*).
  • Bạn không thể dùng thuộc tính mimeGroup của một phần tử <data>.
  • Trong phần tử <data> của một phần tử <intent>, bạn có thể dùng mỗi thuộc tính sau đây tối đa một lần:

    • mimeType
    • scheme
    • host

    Bạn có thể phân phối các thuộc tính này trên nhiều phần tử <data> hoặc dùng các thuộc tính này trong một phần tử <data>.

Phần tử <intent> hỗ trợ ký tự đại diện chung (*) làm giá trị cho một số thuộc tính:

  • Thuộc tính name của phần tử <action>.
  • Loại phụ cho thuộc tính mimeType của phần tử <data> (image/*).
  • Loại và loại phụ cho thuộc tính mimeType của phần tử <data> (*/*).
  • Thuộc tính scheme của phần tử <data>.
  • Thuộc tính host của phần tử <data>.

Trừ khi được chỉ định khác trong danh sách trước đó, hệ thống sẽ không hỗ trợ kiểu kết hợp văn bản và ký tự đại diện, chẳng hạn như prefix*.

Các gói sử dụng một thẩm quyền cụ thể

Nếu bạn cần truy vấn một trình cung cấp nội dung nhưng không biết tên gói cụ thể, bạn có thể khai báo thẩm quyền của trình cung cấp đó trong một phần tử <provider>, như minh hoạ trong đoạn mã sau:

<manifest package="com.example.suite.enterprise">
    <queries>
        <provider android:authorities="com.example.settings.files" />
    </queries>
    ...
</manifest>

Bạn có thể khai báo thẩm quyền của trình cung cấp trong một phần tử <queries>. Trong phần tử <queries>, bạn có thể khai báo một hoặc nhiều phần tử <provider>. Phần tử <provider> có thể bao gồm một quyền của nhà cung cấp hoặc danh sách các thẩm quyền của nhà cung cấp được phân tách bằng dấu chấm phẩy.

Tất cả ứng dụng (không khuyên dùng)

Trong một số ít trường hợp, ứng dụng của bạn có thể cần truy vấn hoặc tương tác với mọi ứng dụng đã cài đặt trên một thiết bị, độc lập với các thành phần trong ứng dụng đó. Để cho phép ứng dụng của bạn xem tất cả các ứng dụng khác đã cài đặt, hệ thống sẽ cấp quyền QUERY_ALL_PACKAGES.

Một số ví dụ về trường hợp sử dụng mà bạn nên thêm quyền QUERY_ALL_PACKAGES:

  • Ứng dụng hỗ trợ tiếp cận
  • Trình duyệt
  • Ứng dụng quản lý thiết bị
  • Ứng dụng bảo mật
  • Ứng dụng chống vi-rút

Tuy nhiên, thông thường, bạn có thể thực hiện các trường hợp sử dụng của ứng dụng bằng cách tương tác với nhóm ứng dụng hiển thị tự động cũng như khai báo các ứng dụng khác mà ứng dụng của bạn cần truy cập trong tệp kê khai. Để tôn trọng quyền riêng tư của người dùng, ứng dụng của bạn chỉ nên yêu cầu hiển thị gói ở mức độ nhỏ nhất mà ứng dụng đó cần để hoạt động.

Nội dung cập nhật chính sách của Google Play nêu ở trên đưa ra nguyên tắc cho những ứng dụng cần có quyền QUERY_ALL_PACKAGES.