Yaygın kullanım alanlarını karşılarken paketin görünürlüğünü sınırlı tutun

Bu dokümanda, bir uygulamanın etkileşimde bulunduğu bazı yaygın kullanım diğer uygulamalar. Her bölümde uygulamanın nasıl başarıya ulaştırılacağı konusunda yol gösterici bilgiler göz önünde bulundurmanız gereken, sınırlı paket görünürlüğü olan Uygulamanız Android 11 (API düzeyi 30) veya sonraki bir sürümü hedefliyorsa.

Android 11 veya sonraki sürümleri hedefleyen bir uygulama, başka bir uygulamada bir etkinlik başlatırsanız, en basit yaklaşım bu işlemi anlamak ve ActivityNotFoundException istisna olarak kullanabilirsiniz.

Uygulamanızın bir bölümü, çağrının startActivity() bir öğe eklemesi gibi başarılı olabilir. Uygulamanızın <queries> öğesi manifest'ini kullanabilirsiniz. Bu genellikle bir <intent> öğesidir.

Açık URL'ler

Bu bölümde, hedef kitleyi hedefleyen bir uygulamada URL'leri açmanın çeşitli yolları Android 11 veya sonraki sürümler.

URL'leri bir tarayıcıda veya başka bir uygulamada aç

Bir URL'yi açmak için şunu içeren bir intent kullanın: ACTION_VIEW intent işlemi, ilişkin daha fazla bilgi için web'de yükleme URL'yi tıklayın. startActivity() adlı kişiyi aradıktan sonra Bu amaç kullanıldığında aşağıdakilerden biri gerçekleşir:

  • URL, bir web tarayıcısı uygulamasında açılır.
  • URL, URL'yi derin bir bağlantı'yı tıklayın.
  • Kullanıcının hangi uygulamayı seçmesini sağlayan bir açıklama iletişim kutusu görünür URL'yi açar.
  • ActivityNotFoundException, şurada yüklü bir uygulama olmadığı için gerçekleşir: URL'yi açabilen cihaz. (Bu olağan dışıdır.)

    Uygulamanızın ActivityNotFoundException.

startActivity() yöntemi, her bir işlem için başka bir uygulamanın etkinliğini başlatmak için <queries> eklemeniz gerekmez öğesini uygulamanızın manifest dosyasına ekleyin veya mevcut <queries> öğesine dokunun. Bu, bir URL'yi açan örtülü ve açık amaçlar için geçerlidir.

Tarayıcının kullanılabilir olup olmadığını kontrol etme

Bazı durumlarda, uygulamanız en az bir tarayıcı olduğunu doğrulamak isteyebilir belirli bir tarayıcının varsayılan tarayıcı olmasına dikkat edin. kontrol edin. Bu gibi durumlarda Manifest dosyanızdaki <queries> öğesinin bir parçası olarak <intent> öğesi:

<!-- 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>

queryIntentActivities() öğesini çağırıp bağımsız değişken olarak bir web amacını ilettiğinizde: döndürülen liste, bazı durumlarda kullanılabilir tarayıcı uygulamalarını içerir. Liste kullanıcı URL'yi tarayıcı dışı bir uygulama olarak belirleyebilir.

URL'leri Özel Sekmelerde Aç

Özel Sekmeler, tarayıcınızın görünümünü ve tarzını özelleştirebilirsiniz. Bir URL'yi şurada açabilirsiniz: Özel Sekme Böylece, uygulama manifestinizde <queries> öğesini eklemeniz veya değiştirmeniz gerekmez.

Ancak, cihazda desteklenen bir tarayıcı olup olmadığını kontrol etmek isteyebilirsiniz. Özel Sekmeler veya Özel Sekmeler ile başlatmak için CustomTabsClient.getPackageName(). Böyle durumlarda, şu <intent> öğesini Manifest dosyanızdaki <queries> öğesi:

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

Tarayıcı olmayan uygulamaların URL'leri işlemesine izin ver

Uygulamanız URL'leri Özel Sekmeler kullanarak açabilse bile, mümkünse tarayıcı olmayan bir uygulamanın bir URL'yi açmasına izin verin. Bunu sağlamak için özelliğini kullanıyorsanız, bir intent kullanarak startActivity() çağrısı yapmayı deneyin ilk adımı FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işareti Sistem bir ActivityNotFoundException atarsa uygulamanız şunları yapabilir: ardından URL'yi Özel Sekmede açın.

Bir intent bu işareti içeriyorsa startActivity() çağrısı, Aşağıdakilerden biri olduğunda ActivityNotFoundException atılır şu koşulların gerçekleşmesi durumunda:

  • Görüşmede doğrudan bir tarayıcı uygulaması başlatılır.
  • Çağrıda kullanıcıya yalnızca kullanıcının kendisi için geçerli olan tarayıcı uygulamaları da var.

Aşağıdaki kod snippet'i, FLAG_ACTIVITY_REQUIRE_NON_BROWSER amaç işareti:

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

Açıklama amaçlı iletişim kutusundan kaçınma

Kullanıcılara belirli bir işlem sırasında gösterilen açıklamada onlar da bir URL açar ve bunun yerine URL'yi bu bölümde durumlarda, hedef kitlenizin FLAG_ACTIVITY_REQUIRE_DEFAULT intent işareti

Bir intent bu işareti içeriyorsa startActivity() çağrısı, Çağrıda bir ActivityNotFoundException kullanıcıya açıklama iletişim kutusu bulunur.

Bir intent hem bu işareti hem de FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işareti, startActivity() çağrısı yapıldığında ActivityNotFoundException değeri şu koşullardan biri gerçekleştiğinde atılır:

  • Arama, tarayıcı uygulamasını doğrudan başlatır.
  • Aramada kullanıcıya açıklama amaçlı bir iletişim kutusu gösterilirdi.

Aşağıdaki kod snippet'i, FLAG_ACTIVITY_REQUIRE_NON_BROWSER öğesinin nasıl kullanılacağını göstermektedir ve FLAG_ACTIVITY_REQUIRE_DEFAULT işaret birlikte:

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

Dosya aç

Uygulamanız dosyaları veya ekleri işliyorsa (örneğin, bir cihazın bu işlemleri yapıp yapamayacağını kontrol etme) bir etkinlik başlatmanın en kolay yolu, dosyayı işleyebilir. Bunu yapmak için ACTION_VIEW amacını içeren bir intent kullanın işlemini ve söz konusu dosyayı temsil eden URI'yı içerir. Google Chrome'da uygulamanız ActivityNotFoundException cihazını yakalayabilir. bir hata gösterebilir veya dosyayı işlemeyi deneyebilirsiniz. kendiniz.

Uygulamanızın, başka bir uygulamanın belirli bir dosyayı açıp açamayacağını önceden bilmesi gerekiyorsa <intent> öğesini, Manifest'inizde <queries> öğesi. Biliyorsanız dosya türünü de ekleyin olduğunu anlayabilir.

<!-- 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>

Ardından, resolveActivity() numaralı telefonu arayarak bir uygulamanın kullanılabilir olup olmadığını kontrol edebilirsiniz inandırıcılığınızı artırır.

URI erişimi ver

Not: URI erişim izinlerini bu bölümde açıklandığı şekilde beyan etmek Android 11 (API düzeyi 30) veya sonraki sürümleri hedefleyen uygulamalar için gereklidir. hedef SDK sürümlerinden ve uygulamanın çalışıp çalışmadığını dışa aktarıyorlar içerik sağlayıcılarıyla çalışır.

Android 11 veya sonraki sürümleri hedefleyen içerik URI'sine eriştiğinizde, uygulamanızın niyeti URI erişimini bildirmelidir izinler Bunun için aşağıdaki amaç işaretlerinden birini veya ikisini birden ayarlayın: FLAG_GRANT_READ_URI_PERMISSION ve FLAG_GRANT_WRITE_URI_PERMISSION.

Android 11 ve sonraki sürümlerde URI erişim izinleri niyeti alan uygulamaya aşağıdaki özellikleri dahil edin:

  • Aşağıdaki koşullara bağlı olarak içerik URI'sinin temsil ettiği verilerden okuma veya yazma verilen URI izinlerini verir.
  • URI yetkilisi. İçerik sağlayıcıyı içeren uygulama farklı olabilir bu verileri kullanır.

Aşağıdaki kod snippet'i, URI izinleri amaç işaretinin nasıl ekleneceğini göstermektedir Böylece Android 11 veya sonraki sürümleri hedefleyen başka bir uygulama içerik URI'sindeki veriler:

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

Hizmetlere bağlanın

Uygulamanızın, görünür olmayan bir hizmetle etkileşimde bulunması gerekiyorsa otomatik olarak kullanıyorsanız, <queries> öğesi içinde uygun intent işlemi Aşağıdaki bölümler yaygın olarak erişilen hizmetlerin kullanımına örnekler verin.

Metin okuma motoruna bağlanın

Uygulamanız bir metin okuma (TTS) motoruyla etkileşimde bulunuyorsa aşağıdakileri ekleyin: Manifest dosyanızdaki <queries> öğesinin bir parçası olarak <intent> öğesi:

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

Konuşma tanıma hizmetine bağlanma

Uygulamanız bir konuşma tanıma hizmetiyle etkileşimde bulunuyorsa aşağıdakileri ekleyin: Manifest dosyanızdaki <queries> öğesinin bir parçası olarak <intent> öğesi:

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

Medya tarayıcısı hizmetlerine bağlanın

Uygulamanız bir istemci medya tarayıcısıysa uygulamasına ait, aşağıdaki <intent> öğesini,<queries> manifesto:

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

Özel işlevler sağlama

Uygulamanızın özelleştirilebilir işlemler gerçekleştirmesi veya özelleştirilebilir öğeleri göstermesi gerekiyorsa etkileşimlerine dayalı olarak e-posta gönderenlerden ibaret kullanıyorsanız, bu amaç filtresini kullanarak özel davranış imza manifest dosyanızdaki <queries> öğesinin bir parçasıdır. Aşağıdaki bölümlerde ayrıntılı kılavuz bilgiler bulabilirsiniz.

SMS uygulamaları için sorgu

Uygulamanız, Örneğin, cihazın varsayılan SMS işleyicisinin hangi uygulama olduğunu kontrol etmek için aşağıdaki <intent> öğesini, <queries> öğesinin bir parçası olarak dahil edin manifest dosyanız:

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

Özel bir paylaşım sayfası oluşturun

Mümkünse sistem tarafından sağlanan paylaşım sayfası. Alternatif olarak: aşağıdaki <intent> öğesini, <queries> öğesinin bir parçası olarak dahil edin manifest dosyanız:

<!-- 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>

Uygulamanızın mantığında paylaşım sayfası oluşturma süreci (ör. queryIntentActivities(), diğer kriterlere kıyasla Android 11'den önceki sürümleri kullanıyorsanız.

Özel metin seçimi işlemlerini göster

Kullanıcılar uygulamanızda metin seçtiğinde metin seçimi araç çubuğu seçili metin üzerinde gerçekleştirilebilecek olası işlemler kümesini gösterir. Bu Araç çubuğu diğer uygulamalardaki özel işlemleri gösterir, aşağıdakileri de ekleyin Manifest dosyanızdaki <queries> öğesinin bir parçası olarak <intent> öğesi:

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

Bir kişiyle ilgili özel veri satırlarını gösterme

Uygulamalar özel veriler ekleyebilir satırlarını Kişiler'e ekleyin Sağlayıcı. Bir kişiler uygulamasının bu özel verileri göstermesi için şunları yapabilirsiniz:

  1. Diğer uygulamalardaki contacts.xml dosyasını okuyun.
  2. Özel MIME türüne karşılık gelen bir simge yükleyin.

Uygulamanız bir kişiler uygulamasıysa aşağıdaki <intent> öğelerini manifest dosyanızdaki <queries> öğesinin:

<!-- 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>