Một quyền của loại thiết bị tùy chọn sẽ ẩn trò chơi của tôi trong Cửa hàng Play cho các loại thiết bị đó?


7

Tôi đã nghe nói ở nhiều nơi rằng nếu ứng dụng của tôi sử dụng quyền không áp dụng cho một thiết bị nhất định, ứng dụng đó sẽ không hiển thị trong cửa hàng chơi cho thiết bị đó. Bây giờ, trong mã của tôi, tôi đang phát âm thanh. Tôi tắt tiếng âm thanh đó bất cứ khi nào có cuộc gọi điện thoại bằng cách này:

 private PhoneStateListener phoneStateListener = new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
                if (state == TelephonyManager.CALL_STATE_RINGING) {
                    onPhoneCallInterrupt(); //Method I made that mutes audio for phone call
                } else if (state == TelephonyManager.CALL_STATE_IDLE) {
                } else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
                    onPhoneCallInterrupt(); //Method I made that mutes audio for phone call
                }
        }
    };

Bây giờ, điều này sử dụng sự cho phép sau trong tệp kê khai:

<uses-feature android:name="android.permission.READ_PHONE_STATE"  android:required="false" />

Tôi có nhận được bất kỳ ngoại lệ nào không vì tôi đã cho phép tùy chọn bằng cách thực hiện android:required = "false"trên các thiết bị không có khả năng tương thích điện thoại (máy tính bảng)?

Lý do tôi rất bối rối về điều này, là vì tôi đang kiểm tra xem điện thoại có đang được sử dụng không, nhưng tôi không sử dụng nó. Vì vậy, ứng dụng của tôi sẽ hoạt động trên máy tính bảng chứ đừng nói đến việc hiển thị trong cửa hàng chơi cho chúng?

Cảm ơn đã giúp tôi giải tỏa sự nhầm lẫn này,

Ruchir


Không thể nói chắc chắn, nhưng tôi nghĩ vậy. Điều này có thể phụ thuộc vào phiên bản Android mang lại được sử dụng mặc dù.
Mario

Câu trả lời:


6

Có, Google Play sẽ lọc ra nội dung không phù hợp với thiết bị hiện tại. Nếu thiết bị của bạn không có camera, bạn sẽ không nhìn thấy các ứng dụng camera nào, tuy nhiên bạn vẫn có thể xem các ứng dụng sử dụng camera như một tính năng nhỏ. Sự khác biệt được thực hiện bằng cách sử dụng android:requiredkhi khai báo một tính năng được sử dụng.

Lưu ý rằng các quyền khác với các tính năng. Quyền là có để bảo mật và bạn tuyên bố việc sử dụng quyền theo <uses-permission>thẻ. Mặt khác, các tính năng có tính tương thích và bạn tuyên bố việc sử dụng các tính năng theo <uses-feature>thẻ.

Google Play sẽ lọc ứng dụng của bạn dựa trên những tính năng mà nó sử dụng. Tuy nhiên, ngay cả khi bạn không bao giờ khai báo bất kỳ <uses-feature>thẻ nào trong tệp kê khai Android, ứng dụng của bạn vẫn có thể được lọc. Điều này là do Google cũng đọc qua tất cả các quyền được khai báo của bạn và đáp ứng mọi yêu cầu tính năng mà bạn chưa khai báo rõ ràng. Vì vậy, nếu bạn tuyên bố sự READ_SMScho phép thì điều này có nghĩa là việc sử dụngandroid.hardware.telephony tính năng này. Vì vậy, nó sẽ không hiển thị trên máy tính bảng hoặc các thiết bị khác mà không có khả năng của điện thoại.

Trích dẫn phần này ở đây :

Lưu ý: Một số quyền hệ thống hoàn toàn yêu cầu tính khả dụng của tính năng thiết bị. Ví dụ: nếu ứng dụng của bạn yêu cầu quyền truy cập vào BLUETOOTH, thì điều này hoàn toàn yêu cầu tính năng thiết bị FEATURE_BLUETOOTH. Bạn có thể tắt tính năng lọc dựa trên tính năng này và cung cấp ứng dụng của bạn cho các thiết bị không có Bluetooth bằng cách đặt thuộc tính bắt buộc thành "false" trong thẻ. Để biết thêm thông tin về các tính năng thiết bị được yêu cầu ngầm, hãy đọc Quyền cho phép Yêu cầu Tính năng.

Vì vậy, để tránh việc ứng dụng của bạn được lọc trên Google Play dựa trên một tính năng nhất định mà ứng dụng của bạn đang sử dụng, bạn cần phải khai báo rõ ràng với android:requiredcài đặt thành false. Tuy nhiên, xin lưu ý rằng tính năng này không còn được đảm bảo hiện diện trên thiết bị mà ứng dụng của bạn đang chạy trên bạn cần kiểm tra xem tính năng này có tồn tại vào thời gian chạy hay không.

Ví dụ về những gì AndroidManifest.xml của bạn nên chứa.

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />

Và một trích dẫn về cách google lọc các ứng dụng dựa trên các tính năng được khai báo rõ ràng. Liên kết

Một tính năng được khai báo rõ ràng là một tính năng mà ứng dụng của bạn khai báo trong một phần tử. Khai báo tính năng có thể bao gồm một android: required = ["true" | Thuộc tính "false"] (nếu bạn đang biên dịch theo API cấp 5 trở lên), cho phép bạn chỉ định liệu ứng dụng có hoàn toàn yêu cầu tính năng và không thể hoạt động đúng nếu không có nó ("true") hay ứng dụng có thích sử dụng tính năng này không nếu có, nhưng được thiết kế để chạy mà không có nó ("false").

Google Play xử lý các tính năng được khai báo rõ ràng theo cách này:

  • Nếu một tính năng được khai báo rõ ràng là bắt buộc, Google Play sẽ thêm tính năng này vào danh sách các tính năng cần thiết cho ứng dụng. Sau đó, nó lọc ứng dụng từ người dùng trên các thiết bị không cung cấp tính năng đó. Ví dụ:

<uses-feature android:name="android.hardware.camera" android:required="true" />

  • Nếu một tính năng được tuyên bố rõ ràng là không bắt buộc, Google Play sẽ không thêm tính năng này vào danh sách các tính năng được yêu cầu. Vì lý do đó, một tính năng không bắt buộc được tuyên bố rõ ràng không bao giờ được xem xét khi lọc ứng dụng. Ngay cả khi thiết bị không cung cấp tính năng được khai báo, Google Play vẫn sẽ xem xét ứng dụng tương thích với thiết bị và sẽ hiển thị cho người dùng, trừ khi áp dụng các quy tắc lọc khác. Ví dụ:

<uses-feature android:name="android.hardware.camera" android:required="false" />

  • Nếu một tính năng được khai báo rõ ràng, nhưng không có thuộc tính android: required, Google Play giả định rằng tính năng này là bắt buộc và thiết lập tính năng lọc trên nó. Nói chung, nếu ứng dụng của bạn được thiết kế để chạy trên Android 1.6 và các phiên bản cũ hơn, thuộc tính android: required không có sẵn trong API và Google Play giả định rằng bất kỳ và tất cả các khai báo đều được yêu cầu.

Lưu ý: Bằng cách khai báo một tính năng một cách rõ ràng và bao gồm một thuộc tính android: required = "false", bạn có thể vô hiệu hóa tất cả các bộ lọc trên Google Play cho tính năng được chỉ định một cách hiệu quả.

Về cơ bản nếu bạn sử dụng các quyền yêu cầu một tính năng, hãy xem danh sách này , bạn nên khai báo rõ ràng tính năng đó với android:required="false"bên cạnh nó và bạn sẽ ổn. Nhưng cũng vì tính năng này không được đảm bảo ở đó nên bạn cũng cần kiểm tra xem tính năng này có tồn tại vào thời gian chạy trước khi sử dụng bất kỳ phương pháp nào yêu cầu nó không. Nếu không, một máy tính bảng sẽ gặp sự cố Phone.call(5551234), trong khi vớiandroid:required="true" bạn sẽ không được yêu cầu kiểm tra xem điện thoại có ở đó không vì nó phải được lọc ra nếu không ứng dụng của bạn đã bị lọc. Mặc dù bạn có thể muốn kiểm tra nó bằng mọi cách vì mọi người có thể cài đặt nó từ các nguồn khác, một cái gì đó để xem xét.

Ví dụ về kiểm tra tính năng tại thời gian chạy.

PackageManager pm = getPackageManager();
if (pm.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
   // This device does have a phone.
   havePhone = true;
}

Nếu bạn có thêm câu hỏi về điều này, tôi thực sự khuyên bạn nên đọc qua:


Như thường lệ Christer, câu trả lời chi tiết tuyệt vời. Câu hỏi của tôi là, dựa trên mã mà tôi cung cấp, tôi có cần phải bắt một số ngoại lệ không? Bởi vì, tôi không thực sự thực hiện bất kỳ cuộc gọi hay bất cứ điều gì ... Thay vào đó, tôi đang kiểm tra xem người dùng có thực hiện cuộc gọi không ... Ngoài ra, nếu bạn có máy tính bảng và không có gì nhiều để hỏi, ứng dụng của tôi có hiển thị không lên trong cửa hàng chơi? Trong tìm kiếm, chỉ cần gõ "Ruchir Popper" và kết quả hy vọng sẽ có một ứng dụng có tên "Balloon Popper". Tôi hiểu nếu đó là quá nhiều để hỏi, chỉ là tôi chỉ có một chiếc điện thoại Android và tôi không biết ai có máy tính bảng. Cho tôi biết! :)
Ruchir Baronia

Tôi không có máy tính bảng Android ngay bây giờ, có thể sau này. Nhưng đưa ra thay đổi được đề xuất của tôi cho tệp kê khai thì nó sẽ hiển thị. Nhưng như tôi đã nói trong câu trả lời của tôi nếu bạn có thêm câu hỏi, bạn nên đọc các liên kết của tôi. Cái thứ hai cho thấy một ví dụ về cách xử lý các tính năng không bắt buộc trong thời gian chạy. developer.android.com/guide/practices/
trộm

Tại sao tôi cần cả hai quyền trong tệp kê khai? Tôi không thể chỉ có android.hardware.telephony? Cảm ơn
Ruchir Baronia

Bởi vì chúng không phải là cả hai quyền, một là quyền và một là tính năng. Quyền là vì lý do bảo mật và các tính năng là vì lý do tương thích. Một số quyền nhất định sẽ hoàn toàn yêu cầu một tính năng nhất định, vì vậy nếu bạn không muốn Google Play lọc ra dựa trên một tính năng mà ứng dụng của bạn đang sử dụng, bạn nên nêu rõ trong tệp kê khai của mình.
Christer

Nhưng, theo đó, tôi chỉ nên cho phép. Tôi chỉ nên giữ tính năng mà thôi, phải không? Bằng cách đó, android sẽ không thử lọc ứng dụng của tôi?
Ruchir Baronia
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.