Häufige Anwendungsfälle bei eingeschränkter Paketsichtbarkeit erfüllen

In diesem Dokument werden einige häufige Anwendungsfälle vorgestellt, bei denen eine App mit anderen Apps. Jeder Abschnitt enthält Anleitungen dazu, wie die App bei eingeschränkter Paketsichtbarkeit. Dies müssen Sie berücksichtigen, Ihre App auf Android 11 (API-Level 30) oder höher ausgerichtet ist.

Wenn eine App, die auf Android 11 oder höher ausgerichtet ist, eine Aktivität in einer anderen App starten, ist es am einfachsten, eine die Absicht erkennen und ActivityNotFoundException Ausnahme, wenn keine App verfügbar ist.

Wenn ein Teil Ihrer App davon abhängt, ob der Aufruf an startActivity() erfolgreich sein kann, etwa durch die Anzeige einer Benutzeroberfläche, ein Element zum <queries>-Element des Manifests. In der Regel ist dies ein <intent>-Element.

URLs öffnen

In diesem Abschnitt werden verschiedene Möglichkeiten zum Öffnen von URLs in einer für die Ausrichtung verwendeten App beschrieben. Android 11 oder höher.

URLs in einem Browser oder einer anderen App öffnen

Verwenden Sie zum Öffnen einer URL einen Intent, der den Parameter ACTION_VIEW-Intent-Aktion wie wie in der Anleitung zum Laden einer Website URL Nach dem Anruf bei startActivity() mit diesem Intent, geschieht Folgendes:

  • Die URL wird in einer Webbrowser-App geöffnet.
  • Die URL wird in einer App geöffnet, die sie als tiefe -Link.
  • Ein Dialogfeld wird angezeigt, in dem der Nutzer die App auswählen kann. öffnet die URL.
  • Ein ActivityNotFoundException tritt auf, weil auf Ihrer Website keine App installiert ist auf dem die URL geöffnet werden kann. (Dies ist ungewöhnlich.)

    Es wird empfohlen, dass Ihre App die ActivityNotFoundException, wenn dieser Fall eintritt.

Da für die Methode startActivity() keine Paketsichtbarkeit erforderlich ist, die Aktivität einer anderen Anwendung starten, müssen Sie kein <queries> -Element zum Manifest Ihrer App hinzu oder nehmen Sie Änderungen an einem vorhandenen <queries> vor. -Elements. Dies gilt sowohl für implizite als auch für explizite Intents, die eine URL öffnen.

Verfügbarkeit eines Browsers prüfen

In einigen Fällen kann für Ihre Anwendung geprüft werden, ob mindestens ein Browser vorhanden ist oder dass ein bestimmter Browser der Standardbrowser ist, bevor Sie versuchen, eine URL zu öffnen. Geben Sie in diesen Fällen Folgendes an: <intent>-Element als Teil des <queries>-Elements in deinem Manifest:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https" />
</intent>

Wenn Sie queryIntentActivities() aufrufen und einen Web-Intent als Argument übergeben, Die zurückgegebene Liste enthält in einigen Fällen die verfügbaren Browser-Apps. Die Liste enthält keine Browser-Apps, wenn der Nutzer die URL so konfiguriert hat, dass er in einem nicht browsergestützte Apps.

URLs in benutzerdefinierten Tabs öffnen

Mit benutzerdefinierten Tabs App das Design des Browsers anpassen. Sie können eine URL in ein benutzerdefinierter Tab ohne das <queries>-Element in deinem App-Manifest hinzufügen oder ändern zu müssen.

Sie sollten jedoch überprüfen, ob das Gerät einen Browser hat, der die Benutzerdefinierte Tabs oder einen bestimmten Browser zum Starten mit benutzerdefinierten Tabs mit CustomTabsClient.getPackageName() Fügen Sie in diesen Fällen das folgende <intent>-Element als Teil des <queries>-Element in deinem Manifest:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.support.customtabs.action.CustomTabsService" />
</intent>

URLs von nicht browsergestützten Apps verarbeiten lassen

Auch wenn Ihre App URLs über benutzerdefinierte Tabs öffnen kann, sollten Sie Lassen Sie wenn möglich eine URL in einer nicht browsergestützten App öffnen. Um diese Funktion in Ihrer App aufrufen möchten, rufen Sie startActivity() mit einem Intent auf mit dem die FLAG_ACTIVITY_REQUIRE_NON_BROWSER Intent-Flag. Wenn das System eine ActivityNotFoundException ausgibt, kann Ihre App und öffnen Sie dann die URL in einem benutzerdefinierten Tab.

Wenn ein Intent dieses Flag enthält, führt ein Aufruf von startActivity() dazu, dass ActivityNotFoundException, das in folgenden Fällen ausgelöst wird: Bedingungen auftritt:

  • Der Anruf hätte direkt eine Browser-App gestartet.
  • Bei diesem Anruf hätte der Nutzer ein Dialogfeld eingeblendet, in dem der einzige Optionen sind Browser-Apps.

Das folgende Code-Snippet zeigt, wie Sie Ihre Logik so aktualisieren, dass die Funktion FLAG_ACTIVITY_REQUIRE_NON_BROWSER-Intent-Flag:

Kotlin

try {
    val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {
        // The URL should either launch directly in a non-browser app (if it's
        // the default) or in the disambiguation dialog.
        addCategory(CATEGORY_BROWSABLE)
        flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER
    }
    startActivity(intent)
} catch (e: ActivityNotFoundException) {
    // Only browser apps are available, or a browser is the default.
    // So you can open the URL directly in your app, for example in a
    // Custom Tab.
    openInCustomTabs(url)
}

Java

try {
    Intent intent = new Intent(ACTION_VIEW, Uri.parse(url));
    // The URL should either launch directly in a non-browser app (if it's the
    // default) or in the disambiguation dialog.
    intent.addCategory(CATEGORY_BROWSABLE);
    intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER);
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    // Only browser apps are available, or a browser is the default.
    // So you can open the URL directly in your app, for example in a
    // Custom Tab.
    openInCustomTabs(url);
}

Nachfragen vermeiden

Wenn Sie vermeiden möchten, dass Nutzer die Details sehen, öffnen sie eine URL und möchten die URL lieber selbst in diesen können Sie einen Intent verwenden, der den FLAG_ACTIVITY_REQUIRE_DEFAULT Intent-Flag.

Wenn ein Intent dieses Flag enthält, führt ein Aufruf von startActivity() dazu, dass ActivityNotFoundException, die ausgelöst werden, wenn der Aufruf Nachfrage für den Nutzer.

Wenn ein Intent sowohl dieses Flag als auch den FLAG_ACTIVITY_REQUIRE_NON_BROWSER Intent-Flag gesetzt, führt ein Aufruf von startActivity() zu einem ActivityNotFoundException wird ausgelöst, wenn eine der folgenden Bedingungen eintritt:

  • Der Anruf hätte die Browser-App direkt gestartet.
  • Beim Anruf hätte dem Nutzer ein Dialogfeld zur Auswahl angezeigt.

Das folgende Code-Snippet zeigt, wie FLAG_ACTIVITY_REQUIRE_NON_BROWSER verwendet wird und FLAG_ACTIVITY_REQUIRE_DEFAULT zusammen:

Kotlin

val url = URL_TO_LOAD
try {
    // For this intent to be invoked, the system must directly launch a
    // non-browser app.
    val intent = Intent(ACTION_VIEW, Uri.parse(url)).apply {
        addCategory(CATEGORY_BROWSABLE)
        flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_REQUIRE_NON_BROWSER or
                FLAG_ACTIVITY_REQUIRE_DEFAULT
    }
    startActivity(intent)
} catch (e: ActivityNotFoundException) {
    // This code executes in one of the following cases:
    // 1. Only browser apps can handle the intent.
    // 2. The user has set a browser app as the default app.
    // 3. The user hasn't set any app as the default for handling this URL.
    openInCustomTabs(url)
}

Java

String url = URL_TO_LOAD;
try {
    // For this intent to be invoked, the system must directly launch a
    // non-browser app.
    Intent intent = new Intent(ACTION_VIEW, Uri.parse(url));
    intent.addCategory(CATEGORY_BROWSABLE);
    intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_REQUIRE_NON_BROWSER |
            FLAG_ACTIVITY_REQUIRE_DEFAULT);
    startActivity(intent);
} catch (ActivityNotFoundException e) {
    // This code executes in one of the following cases:
    // 1. Only browser apps can handle the intent.
    // 2. The user has set a browser app as the default app.
    // 3. The user hasn't set any app as the default for handling this URL.
    openInCustomTabs(url);
}

Datei öffnen

Wenn Ihre App Dateien oder Anhänge verarbeitet, z. B. ob ein Gerät prüfen kann, eine bestimmte Datei öffnen, ist es normalerweise am einfachsten, eine Aktivität zu starten, zu verarbeiten. Verwenden Sie dazu einen Intent, der den Intent ACTION_VIEW enthält -Aktion und den URI für die jeweilige Datei an. Wenn keine App verfügbar ist auf kann deine App das ActivityNotFoundException erkennen. In der Ausnahmebehandlungslogik können Sie entweder einen Fehler anzeigen oder versuchen, selbst.

Wenn Ihre App vorab wissen muss, ob eine andere App eine bestimmte Datei öffnen kann, Fügen Sie das Element <intent> in das folgende Code-Snippet als Teil des <queries>-Element in deinem Manifest. Geben Sie den Dateityp an, wenn Sie bereits wissen. wie es zum Zeitpunkt der Kompilierung ist.

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <!-- If you don't know the MIME type in advance, set "mimeType" to "*/*". -->
  <data android:mimeType="application/pdf" />
</intent>

Du kannst dann prüfen, ob eine App verfügbar ist, indem du resolveActivity() anrufst mit Ihrer Absicht an.

URI-Zugriff gewähren

Hinweis:URI-Zugriffsberechtigungen wie in diesem Abschnitt beschrieben deklarieren ist für Apps erforderlich, die auf Android 11 (API-Level 30) oder höher ausgerichtet sind, und empfohlen für alle Apps, unabhängig von der SDK-Zielversion und sie exportieren ihren Content-Providern.

Für Apps, die auf Android 11 oder höher ausgerichtet sind, auf den Inhalts-URI zugreifen, muss im Intent Ihrer App der URI-Zugriff deklariert werden. Berechtigungen indem Sie eines oder beide der folgenden Intent-Flags festlegen: FLAG_GRANT_READ_URI_PERMISSION und FLAG_GRANT_WRITE_URI_PERMISSION

Unter Android 11 und höher erhalten die URI-Zugriffsberechtigungen den die folgenden Funktionen für die Anwendung, die den Intent empfängt:

  • Aus den Daten lesen oder in diese schreiben, die der Inhalts-URI darstellt, die angegebenen URI-Berechtigungen.
  • Einblick in die App erhalten, in der der Contentanbieter mit dem URI-Befugnis. Die App, zu der der Contentanbieter gehört, kann sich unterscheiden aus der App, die den Intent sendet.

Im folgenden Code-Snippet wird gezeigt, wie ein URI-Berechtigungs-Intent-Flag hinzugefügt wird. sodass eine andere App, die auf Android 11 oder höher ausgerichtet ist, die Daten im Inhalts-URI:

Kotlin

val shareIntent = Intent(Intent.ACTION_VIEW).apply {
    flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
    data = CONTENT_URI_TO_SHARE_WITH_OTHER_APP
}

Java

Intent shareIntent = new Intent(Intent.ACTION_VIEW);
shareIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION);
shareIntent.setData(CONTENT_URI_TO_SHARE_WITH_OTHER_APP);

Verbindung zu Diensten herstellen

Wenn Ihre App mit einem Dienst interagieren muss, der nicht sichtbar ist automatisch, können Sie das in einem <queries>-Element eine geeignete Aktion ausführen. Die folgenden Abschnitte geben Beispiele für häufig genutzte Dienste an.

Mit einer Text-in-Sprache-Engine verbinden

Wenn Ihre App mit einer Sprachausgabe-Engine interagiert, fügen Sie Folgendes ein: <intent>-Element als Teil des <queries>-Elements in deinem Manifest:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.TTS_SERVICE" />
</intent>

Verbindung zu einem Spracherkennungsdienst herstellen

Wenn Ihre App mit einem Spracherkennungsdienst interagiert, geben Sie Folgendes an: <intent>-Element als Teil des <queries>-Elements in deinem Manifest:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.speech.RecognitionService" />
</intent>

Verbindung zu Medienbrowserdiensten herstellen

Wenn Ihre App ein Client-Medienbrowser ist App enthalten, einschließlich das folgende <intent>-Element als Teil des <queries>-Elements in deinem Manifest:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.media.browse.MediaBrowserService" />
</intent>

Benutzerdefinierte Funktionen bereitstellen

Wenn Ihre App anpassbare Aktionen ausführen oder anpassbare Aktionen anzeigen muss Informationen auf Grundlage der Interaktionen mit anderen Apps dargestellt werden, können Sie darstellen, Benutzerdefiniertes Verhalten mit Intent-Filter Signaturen als Teil des <queries>-Elements in deinem Manifest. In den folgenden Abschnitten finden Sie detaillierte Anleitungen für einige gängige Szenarien.

Abfrage für SMS-Apps

Wenn Ihre App Informationen zu einer Reihe von SMS-Apps benötigt, die auf einem um beispielsweise zu prüfen, welche App der Standard-SMS-Handler des Geräts ist, das folgende <intent>-Element als Teil des <queries>-Elements in Ihr Manifest:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.SENDTO"/>
  <data android:scheme="smsto" android:host="*" />
</intent>

Benutzerdefiniertes Sharesheet erstellen

Verwenden Sie nach Möglichkeit ein vom System bereitgestelltes Sharesheet Alternativ können Sie das folgende <intent>-Element als Teil des <queries>-Elements in Ihr Manifest:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.SEND" />
  <!-- Replace with the MIME type that your app works with, if needed. -->
  <data android:mimeType="image/jpeg" />
</intent>

Der Prozess der Erstellung des Sharesheet in der Logik Ihrer App, z. B. der Aufruf von queryIntentActivities(), bleibt ansonsten unverändert im Vergleich zu Android-Versionen vor Android 11.

Benutzerdefinierte Aktionen für die Textauswahl anzeigen

Wenn Nutzer in Ihrer App Text auswählen, wird eine Textauswahl Symbolleiste zeigt die möglichen Vorgänge an, die für den ausgewählten Text ausgeführt werden können. Wenn dieses zeigt die Symbolleiste benutzerdefinierte Aktionen aus anderen Apps an, darunter Folgendes: <intent>-Element als Teil des <queries>-Elements in deinem Manifest:

<!-- Place inside the <queries> element. -->
<intent>
  <action android:name="android.intent.action.PROCESS_TEXT" />
  <data android:mimeType="text/plain" />
</intent>

Benutzerdefinierte Datenzeilen für einen Kontakt anzeigen

Apps können benutzerdefinierte Daten hinzufügen Zeilen zu den Kontakten hinzufügen Anbieter. Damit diese benutzerdefinierten Daten in einer Kontakte-App angezeigt werden können, müssen kann Folgendes tun:

  1. Die Datei contacts.xml aus den anderen Apps lesen.
  2. Lädt ein Symbol entsprechend dem benutzerdefinierten MIME-Typ.

Wenn deine App eine Kontakte-App ist, füge die folgenden <intent>-Elemente als Teil ein des <queries>-Elements in deinem Manifest:

<!-- Place inside the <queries> element. -->
<!-- Lets the app read the contacts.xml file from other apps. -->
<intent>
  <action android:name="android.accounts.AccountAuthenticator" />
</intent>
<!-- Lets the app load an icon corresponding to the custom MIME type. -->
<intent>
  <action android:name="android.intent.action.VIEW" />
  <data android:scheme="content" android:host="com.android.contacts"
        android:mimeType="vnd.android.cursor.item/*" />
</intent>