Versteckt eine optionale gerätetypspezifische Berechtigung mein Spiel im Play Store für diese Gerätetypen?

7

Ich habe an vielen Stellen gehört, dass meine App, wenn sie eine Berechtigung verwendet, die für ein bestimmtes Gerät nicht gilt, nicht im Play Store für dieses Gerät angezeigt wird. Jetzt spiele ich in meinem Code Audio ab. Ich schalte das Audio stumm, wenn ein Anruf eingeht:

 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
                }
        }
    };

Dies verwendet nun die folgende Berechtigung im Manifest:

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

Bekomme ich Ausnahmen, weil ich die Berechtigung android:required = "false"auf Geräten ohne Telefonkompatibilität (Tablets) optional gemacht habe?

Der Grund, warum ich diesbezüglich so verwirrt bin, ist, dass ich überprüfe, ob das Telefon verwendet wird, aber ich benutze es nicht. Funktioniert meine App auf Tablets, geschweige denn im Play Store?

Vielen Dank, dass Sie mir geholfen haben, diese Verwirrung zu beseitigen.

Ruchir

Ruchir Baronia
quelle
Kann ich nicht sicher sagen, aber ich würde es mir denken. Dies kann jedoch von der verwendeten Android-Version abhängen.
Mario

Antworten:

6

Ja, Google Play filtert Inhalte heraus, die für das aktuelle Gerät nicht geeignet sind. Wenn Ihr Gerät keine Kamera hat, sollten keine Kamera-Apps für Sie sichtbar sein. Möglicherweise sehen Sie jedoch weiterhin Apps, die die Kamera als Nebenfunktion verwenden. Die Unterscheidung erfolgt durch die Verwendung von android:requiredbei der Deklaration eines verwendeten Features.

Beachten Sie, dass sich die Berechtigungen von den Funktionen unterscheiden. Berechtigungen dienen der Sicherheit und Sie erklären die Verwendung von Berechtigungen durch das <uses-permission>Tag. Features hingegen dienen der Kompatibilität und Sie erklären die Verwendung von Features durch das <uses-feature>Tag.

Google Play filtert Ihre Anwendung basierend auf den verwendeten Funktionen. Selbst wenn Sie niemals <uses-feature>Tags in Ihrer Android-Manifest-Datei deklarieren, wird Ihre App möglicherweise dennoch gefiltert. Dies liegt daran, dass Google auch alle Ihre deklarierten Berechtigungen durchliest und auf alle Funktionsanforderungen schließt, die Sie nicht explizit deklariert haben. Wenn Sie also die READ_SMSBerechtigung deklarieren, bedeutet dies die Verwendung der android.hardware.telephonyFunktion. Es wird also nicht auf Tablets oder anderen Geräten ohne Telefonfunktion angezeigt.

Diesen Abschnitt hier zitieren :

Hinweis: Einige Systemberechtigungen erfordern implizit die Verfügbarkeit einer Gerätefunktion. Wenn Ihre App beispielsweise die Berechtigung zum Zugriff auf BLUETOOTH anfordert, ist implizit die Gerätefunktion FEATURE_BLUETOOTH erforderlich. Sie können die Filterung basierend auf dieser Funktion deaktivieren und Ihre App für Geräte ohne Bluetooth verfügbar machen, indem Sie das erforderliche Attribut im Tag auf "false" setzen. Weitere Informationen zu implizit erforderlichen Gerätefunktionen finden Sie unter Berechtigungen, die Funktionsanforderungen implizieren.

Um zu vermeiden, dass Ihre App in Google Play basierend auf einer bestimmten Funktion gefiltert wird, die Ihre App verwendet, müssen Sie sie explizit mit dem android:requiredWert false deklarieren . Beachten Sie jedoch, dass Sie überprüfen müssen, ob die Funktion zur Laufzeit vorhanden ist, da nicht mehr garantiert ist, dass sie auf dem Gerät vorhanden ist, auf dem Ihre App ausgeführt wird.

Beispiel dafür, was Ihre AndroidManifest.xml enthalten sollte.

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

Und ein Zitat darüber, wie Google Apps basierend auf explizit deklarierten Funktionen filtert. Verknüpfung

Eine explizit deklarierte Funktion ist eine, die Ihre Anwendung in einem Element deklariert. Die Feature-Deklaration kann ein Android enthalten: required = ["true" | Attribut "false"] (wenn Sie mit API-Level 5 oder höher kompilieren), mit dem Sie angeben können, ob die Anwendung die Funktion unbedingt benötigt und ohne sie nicht ordnungsgemäß funktioniert ("true") oder ob die Anwendung die Funktion bevorzugt falls verfügbar, aber so konzipiert, dass es ohne es ausgeführt werden kann ("false").

Google Play behandelt explizit deklarierte Funktionen folgendermaßen:

  • Wenn eine Funktion ausdrücklich als erforderlich deklariert wird, fügt Google Play die Funktion der Liste der erforderlichen Funktionen für die Anwendung hinzu. Anschließend wird die Anwendung von Benutzern auf Geräten gefiltert, die diese Funktion nicht bereitstellen. Zum Beispiel:

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

  • Wenn eine Funktion ausdrücklich als nicht erforderlich deklariert wird, fügt Google Play die Funktion nicht zur Liste der erforderlichen Funktionen hinzu. Aus diesem Grund wird eine explizit deklarierte nicht erforderliche Funktion beim Filtern der Anwendung niemals berücksichtigt. Auch wenn das Gerät die deklarierte Funktion nicht bietet, betrachtet Google Play die mit dem Gerät kompatible Anwendung und zeigt sie dem Benutzer an, sofern keine anderen Filterregeln gelten. Zum Beispiel:

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

  • Wenn eine Funktion explizit deklariert wird, jedoch ohne das Attribut android: required, geht Google Play davon aus, dass die Funktion erforderlich ist, und richtet eine Filterung dafür ein. Wenn Ihre Anwendung für die Ausführung mit Android 1.6 und früheren Versionen ausgelegt ist, ist das Attribut android: required in der API im Allgemeinen nicht verfügbar, und Google Play geht davon aus, dass alle Deklarationen erforderlich sind.

Hinweis: Indem Sie eine Funktion explizit deklarieren und ein Attribut für android: required = "false" einschließen, können Sie alle Filter in Google Play für die angegebene Funktion effektiv deaktivieren.

Wenn Sie Berechtigungen verwenden, für die eine Funktion erforderlich ist, lesen Sie diese Liste . Sie sollten diese Funktion explizit mit der Funktion android:required="false"daneben deklarieren, und schon kann es losgehen. Da diese Funktion jedoch nicht garantiert vorhanden ist, müssen Sie auch überprüfen, ob die Funktion zur Laufzeit vorhanden ist, bevor Sie Methoden verwenden, die dies erfordern. Andernfalls stürzt ein Tablet ab Phone.call(5551234), während android:required="true"Sie nicht überprüfen müssen, ob das Telefon vorhanden ist, wie es sein muss, da sonst Ihre App herausgefiltert werden sollte. Obwohl Sie es trotzdem überprüfen möchten, da die Leute es möglicherweise aus anderen Quellen installieren, sollten Sie dies berücksichtigen.

Beispiel für die Überprüfung der Funktion zur Laufzeit.

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

Wenn Sie weitere Fragen dazu haben, empfehle ich Ihnen wirklich, diese durchzulesen:

Christer
quelle
Wie immer Christer, tolle ausführliche Antwort. Meine Frage ist, ob ich basierend auf dem von mir bereitgestellten Code einige Ausnahmen abfangen muss. Weil ich eigentlich keine Anrufe tätige oder so ... Stattdessen überprüfe ich, ob der Benutzer gerade telefoniert ... Wenn Sie ein Tablet haben und es nicht zu viel verlangt, wird meine App angezeigt im Spieleladen? Geben Sie bei der Suche einfach "Ruchir Popper" ein und das Ergebnis sollte hoffentlich eine App mit der Aufschrift "Balloon Popper" enthalten. Ich verstehe, wenn das zu viel verlangt, ist es nur so, dass ich nur ein Android-Handy habe und ich kenne niemanden, der ein Tablet hat. Gib mir Bescheid! :)
Ruchir Baronia
Ich habe momentan kein Android-Tablet, vielleicht später. Aber wenn ich meine vorgeschlagene Änderung an der Manifestdatei gebe, sollte sie angezeigt werden. Aber wie ich in meiner Antwort sagte, wenn Sie weitere Fragen haben, sollten Sie meine Links lesen. Das zweite zeigt ein Beispiel für den Umgang mit nicht erforderlichen Funktionen zur Laufzeit. developer.android.com/guide/practices/…
Christer
Warum benötige ich beide Berechtigungen im Manifest? Kann ich nicht nur android.hardware.telephony haben? Vielen Dank
Ruchir Baronia
Da es sich nicht um beide Berechtigungen handelt, ist eine eine Berechtigung und eine eine Funktion. Berechtigungen gelten aus Sicherheitsgründen und Funktionen aus Kompatibilitätsgründen. Für bestimmte Berechtigungen ist implizit eine bestimmte Funktion erforderlich. Wenn Sie also nicht möchten, dass Google Play anhand einer von Ihrer App verwendeten Funktion herausfiltert, sollten Sie dies in Ihrer Manifestdatei explizit angeben.
Christer
Aber demnach sollte ich einfach die Erlaubnis loslassen. Ich sollte nur die Funktion behalten, oder? Auf diese Weise wird Android nicht versuchen, meine App herauszufiltern?
Ruchir Baronia