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

Bu dokümanda, bir uygulamanın diğer uygulamalarla etkileşimde bulunduğu bazı yaygın kullanım alanları açıklanmaktadır. Her bölümde, uygulamanızın Android 11 (API düzeyi 30) veya sonraki sürümleri hedefliyorsa göz önünde bulundurmanız gereken, sınırlı paket görünürlüğüyle uygulama işlevlerinin nasıl gerçekleştirileceği konusunda yol gösterici bilgiler verilmektedir.

Android 11 veya sonraki sürümleri hedefleyen bir uygulama, başka bir uygulamada etkinlik başlatmak için bir intent kullandığında, en basit yaklaşım amacı çağırmak ve uygulama yoksa ActivityNotFoundException istisnasını ele almaktır.

Uygulamanızın bir bölümü, startActivity() çağrısının başarılı olup olamayacağını öğrenmek istiyorsa (ör. kullanıcı arayüzü gösterme) uygulama manifestinizin <queries> öğesine bir öğe ekleyin. Bu genellikle bir <intent> öğesidir.

Açık URL'ler

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

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

Bir URL'yi açmak için web URL'si yükleme rehberinde açıklandığı gibi ACTION_VIEW intent işlemini içeren bir intent kullanın. Bu niyeti kullanarak startActivity() adlı kişiyi çağırdıktan sonra aşağıdakilerden biri gerçekleşir:

  • URL, bir web tarayıcısı uygulamasında açılır.
  • URL, derin bağlantı olarak URL'yi destekleyen bir uygulamada açılır.
  • Kullanıcının URL'yi hangi uygulamanın açacağını seçmesine olanak tanıyan bir açıklama iletişim kutusu gösterilir.
  • Cihazda URL'yi açabilecek bir uygulama yüklü olmadığından ActivityNotFoundException hatası oluşur. (Bu olağan dışıdır.)

    Uygulamanızın, ActivityNotFoundException öğesini yakalayıp işlemesi önerilir.

startActivity() yöntemi başka bir uygulamanın etkinliğini başlatmak için paket görünürlüğü gerektirmediğinden, uygulamanızın manifest dosyasına bir <queries> öğesi eklemeniz veya mevcut bir <queries> öğesinde herhangi bir değişiklik yapmanız gerekmez. 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, bir URL'yi açmaya çalışmadan önce cihazda en az bir tarayıcı olduğunu veya belirli bir tarayıcının varsayılan tarayıcı olduğunu doğrulamak isteyebilir. Böyle durumlarda manifest dosyanızdaki <queries> öğesinin bir parçası olarak aşağıdaki <intent> öğesini ekleyin:

<!-- 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 bir web amacını bağımsız değişken olarak ilettiğinizde döndürülen liste, bazı durumlarda kullanılabilir tarayıcı uygulamalarını içerir. Kullanıcı URL'yi varsayılan olarak tarayıcı dışı bir uygulamada açılacak şekilde yapılandırdıysa liste tarayıcı uygulamalarını içermez.

URL'leri Özel Sekmelerde Aç

Özel Sekmeler, uygulamaların tarayıcının görünümünü ve tarzını özelleştirmesine olanak tanır. Uygulama manifest dosyanıza <queries> öğesini eklemeniz veya değiştirmeniz gerekmeden URL'yi Özel Sekmede açabilirsiniz.

Ancak, cihazda Özel Sekmeleri destekleyen bir tarayıcı olup olmadığını kontrol etmek veya CustomTabsClient.getPackageName() kullanarak Özel Sekmeleri başlatmak için belirli bir tarayıcı seçmek isteyebilirsiniz. Böyle durumlarda manifest dosyanıza <queries> öğesinin bir parçası olarak aşağıdaki <intent> öğesini ekleyin:

<!-- 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 Özel Sekmeleri kullanarak URL'leri açabilse bile, mümkünse tarayıcı olmayan bir uygulamanın bir URL'yi açmasına izin vermeniz önerilir. Uygulamanızda bu özelliği sağlamak için FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işaretini oluşturan bir intent kullanarak startActivity() çağrısı yapmayı deneyin. Sistem bir ActivityNotFoundException atarsa uygulamanız URL'yi bir Özel Sekmede açabilir.

Bir intent bu işareti içeriyorsa aşağıdaki koşullardan biri gerçekleştiğinde startActivity() çağrısı ActivityNotFoundException değerinin atılmasına neden olur:

  • Görüşmede doğrudan bir tarayıcı uygulaması başlatılır.
  • Çağrı, kullanıcıya yalnızca tarayıcı uygulamaları kullanabileceği bir açıklama iletişim kutusu gösterecekti.

Aşağıdaki kod snippet'i, FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işaretini kullanmak için mantığınızı nasıl güncelleyeceğinizi gösterir:

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ıların bir URL'yi açtıklarında görebilecekleri açıklama amaçlı iletişim kutusunu göstermek istemiyorsanız ve bu durumlarda URL'yi kendiniz yönetmeyi tercih ederseniz FLAG_ACTIVITY_REQUIRE_DEFAULT amaç işaretini ayarlayan bir intent kullanabilirsiniz.

Bir intent bu işareti içeriyorsa startActivity() çağrısı, kullanıcıya açıklama amaçlı iletişim kutusu gösterdiğinde ActivityNotFoundException çağrısının atılmasına neden olur.

Bir intent hem bu işareti hem de FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işaretini içeriyorsa startActivity() çağrısı, aşağıdaki koşullardan biri gerçekleştiğinde ActivityNotFoundException değerinin atılmasına neden olur:

  • 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'inde FLAG_ACTIVITY_REQUIRE_NON_BROWSER ve FLAG_ACTIVITY_REQUIRE_DEFAULT işaretlerinin birlikte nasıl kullanılacağı gösterilmektedir:

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 belirli bir dosyayı açıp açamayacağını kontrol etiyorsa) genellikle en kolay yol, dosyayı işleyebilecek bir etkinlik başlatmaktır. Bunu yapmak için ACTION_VIEW intent işlemini ve söz konusu dosyayı temsil eden URI'yı içeren bir intent kullanın. Cihazda kullanılabilir uygulama yoksa uygulamanız ActivityNotFoundException bilgisini yakalayabilir. İstisna işleme mantığınıza göre bir hata gösterebilir veya dosyayı kendiniz işlemeyi deneyebilirsiniz.

Uygulamanızın, belirli bir dosyayı başka bir uygulamanın açıp açamayacağını önceden bilmesi gerekiyorsa manifest dosyanızdaki <queries> öğesinin bir parçası olarak aşağıdaki kod snippet'ine <intent> öğesini ekleyin. Derleme sırasında ne olduğunu biliyorsanız dosya türünü de ekleyin.

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

Daha sonra niyetinizi belirterek resolveActivity() araması yaparak bir uygulamanın kullanılabilir olup olmadığını kontrol edebilirsiniz.

URI erişimi ver

Not: Android 11 (API düzeyi 30) veya sonraki sürümleri hedefleyen uygulamalar için bu bölümde açıklandığı şekilde URI erişim izinlerinin açıklanması zorunludur ve hedef SDK sürümlerinden ve içerik sağlayıcılarını dışa aktarıp aktarmadıklarından bağımsız olarak tüm uygulamalar için önerilir.

Android 11 veya sonraki sürümleri hedefleyen uygulamaların içerik URI'sine erişmesi için uygulamanızın amacı, şu amaç işaretlerinden birini veya her ikisini ayarlayarak URI erişim izinlerini beyan etmelidir: FLAG_GRANT_READ_URI_PERMISSION ve FLAG_GRANT_WRITE_URI_PERMISSION.

Android 11 ve sonraki sürümlerde URI erişim izinleri, amacı alan uygulamaya aşağıdaki özellikleri sağlar:

  • Verilen URI izinlerine bağlı olarak içerik URI'sinin temsil ettiği verilerden okuma veya yazma.
  • URI yetkilisiyle eşleşen içerik sağlayıcıyı içeren uygulamayla ilgili bilgi edinin. İçerik sağlayıcıyı içeren uygulama, amacı gönderen uygulamadan farklı olabilir.

Aşağıdaki kod snippet'i, Android 11 veya sonraki sürümleri hedefleyen başka bir uygulamanın içerik URI'sindeki verileri görüntüleyebilmesi için URI izinleri intent işaretinin nasıl ekleneceğini göstermektedir:

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 otomatik olarak görünür olmayan bir hizmetle etkileşim kurması gerekiyorsa uygun intent işlemini bir <queries> öğesi içinde belirtebilirsiniz. Aşağıdaki bölümlerde, yaygın olarak erişilen hizmetlerin kullanıldığı örnekler verilmiştir.

Metin okuma motoruna bağlanın

Uygulamanız metin okuma (TTS) motoruyla etkileşimde bulunuyorsa manifest dosyanıza <queries> öğesinin bir parçası olarak aşağıdaki <intent> öğesini ekleyin:

<!-- 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 manifest dosyanıza <queries> öğesinin bir parçası olarak aşağıdaki <intent> öğesini ekleyin:

<!-- 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ı uygulaması ise manifestinize <queries> öğesinin parçası olarak aşağıdaki <intent> öğesini ekleyin:

<!-- 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 yapması veya diğer uygulamalarla olan etkileşimine göre özelleştirilebilir bilgiler göstermesi gerekiyorsa manifest dosyanızdaki <queries> öğesinin bir parçası olarak amaç filtresi imzalarını kullanarak bu özel davranışı temsil edebilirsiniz. Aşağıdaki bölümlerde, sık karşılaşılan bazı senaryolar için ayrıntılı yönergeler sunulmaktadır.

SMS uygulamaları için sorgu

Uygulamanız bir cihazda yüklü SMS uygulamaları grubuyla ilgili bilgiye ihtiyaç duyuyorsa (örneğin, cihazın varsayılan SMS işleyicisinin hangi uygulama olduğunu kontrol etmek için) manifest dosyanıza <queries> öğesinin bir parçası olarak aşağıdaki <intent> öğesini ekleyin:

<!-- 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ün olduğunda sistem tarafından sağlanan bir paylaşım sayfası kullanın. Alternatif olarak, aşağıdaki <intent> öğesini manifest dosyanızdaki <queries> öğesinin bir parçası olarak ekleyin:

<!-- 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() çağrısı) Android 11'den önceki Android sürümlerine kıyasla değişmez.

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

Kullanıcılar uygulamanızda metin seçtiğinde, bir metin seçimi araç çubuğu, seçilen metinde gerçekleştirilebilecek olası işlemler kümesini gösterir. Bu araç çubuğu diğer uygulamalardaki özel işlemleri gösteriyorsa manifest dosyanıza <queries> öğesinin bir parçası olarak aşağıdaki <intent> öğesini ekleyin:

<!-- 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, Kişi Sağlayıcı'ya özel veri satırları ekleyebilir. Bir kişiler uygulamasının bu özel verileri göstermesi için şunları yapabilmesi gerekir:

  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 manifest dosyanızdaki <queries> öğesinin parçası olarak aşağıdaki <intent> öğelerini ekleyin:

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