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

Bu dokümanda, uygulamaların diğer uygulamalarla etkileşim kurduğu bazı yaygın kullanım alanları açıklanmaktadır. Her bölümde, uygulamanın işlevini sınırlı paket görünürlüğüyle nasıl gerçekleştirebileceğinize dair yol gösterici bilgiler sağlanmaktadır. Bu bilgiler, uygulamanızın Android 11 (API düzeyi 30) veya sonraki sürümleri hedefliyorsa dikkate almanız gerekir.

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

Uygulamanızın bir kısmı, startActivity() çağrısının başarılı olup olmadığını (ör. kullanıcı arayüzü gösterme) bilmek istiyorsa 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 tarayıcıda veya başka bir uygulamada açma

Bir URL'yi açmak için web URL'si yükleme kılavuzunda açıklandığı gibi ACTION_VIEW intent işlemini içeren bir niyet kullanın. Bu amacı kullanarak startActivity() yöntemini ç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örüntülenir.
  • ActivityNotFoundException, cihazda URL'yi açabilecek yüklü bir uygulama olmadığı için oluşur. (Bu, olağan dışı bir durumdur.)

    Böyle bir durumda uygulamanızın ActivityNotFoundException öğesini yakalaması ve 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 <queries> öğesi eklemeniz veya mevcut bir <queries> öğesinde değişiklik yapmanız gerekmez. Bu, bir URL'yi açan hem üstü kapalı hem de açık amaçlar için geçerlidir.

Kullanılabilir bir tarayıcı 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. Bu durumlarda, 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.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="https" />
</intent>

queryIntentActivities() yöntemini çağırdığınızda ve bir web intent'i 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ışındaki bir uygulamada açılacak şekilde yapılandırdıysa liste tarayıcı uygulamalarını içermez.

URL'leri Özel Sekmelerde Aç

Özel Sekmeler, bir uygulamanın tarayıcının görünümünü ve hissini özelleştirmesini sağlar. Uygulama manifest dosyanızdaki <queries> öğesini eklemeniz veya değiştirmenize gerek kalmadan bir URL'yi Özel Sekmede açabilirsiniz.

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

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

Tarayıcı dışı uygulamaların URL'leri işlemesine izin verme

Uygulamanız URL'leri Özel Sekmeler kullanarak açabilse bile, mümkünse tarayıcı dışındaki bir uygulamanın URL'yi açmasına izin vermeniz önerilir. Uygulamanızda bu özelliği sağlamak için FLAG_ACTIVITY_REQUIRE_NON_BROWSER amaç bayrağını ayarlayan bir niyet kullanarak startActivity() çağrısı yapmayı deneyin. Sistem bir ActivityNotFoundException atarsa uygulamanız, ardından URL'yi bir Özel Sekmede açabilir.

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

  • Görüşme sırasında doğrudan bir tarayıcı uygulaması başlatılacaktı.
  • Çağrı, kullanıcıya tek seçeneğin tarayıcı uygulamaları olduğu bir açıklama amaçlı 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östermekten kaçınmak ve bu durumlarda URL'yi kendiniz işlemeyi tercih etmek isterseniz FLAG_ACTIVITY_REQUIRE_DEFAULT amaç bayrağını ayarlayan bir intent kullanabilirsiniz.

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

Bir amaç hem bu işareti hem de FLAG_ACTIVITY_REQUIRE_NON_BROWSER amaç işaretini içeriyorsa startActivity() çağrısı, aşağıdaki koşullardan biri gerçekleştiğinde bir ActivityNotFoundException gönderilmesine neden olur:

  • Çağrı doğrudan tarayıcı uygulamasını başlatacaktı.
  • Çağrı, kullanıcıya konuyu açıklayan bir iletişim kutusu gösterilir.

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

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, bir cihazın belirli bir dosyayı açıp açamayacağını kontrol etmek gibi dosyaları veya ekleri işliyorsa genellikle en kolay yol, dosyayı işleyebilecek bir etkinlik başlatmayı denemektir. Bunun için ACTION_VIEW intent işlemini ve ilgili dosyayı temsil eden URI'yı içeren bir intent kullanın. Cihazda kullanılabilir uygulama yoksa uygulamanız ActivityNotFoundException cihazını yakalayabilir. İstisna işleme mantığınızda bir hata gösterebilir veya dosyayı kendiniz işlemeyi deneyebilirsiniz.

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

Ardından amacınızla resolveActivity() numaralı telefonu arayarak bir uygulamanın kullanılabilir olup olmadığını kontrol edebilirsiniz.

URI erişimi ver

Not: URI erişim izinlerinin bu bölümde açıklandığı şekilde beyan edilmesi, Android 11 (API düzeyi 30) veya sonraki sürümleri hedefleyen uygulamalar için zorunludur. Ayrıca hedef SDK sürümleri ve içerik sağlayıcılarını dışa aktarıp aktarmadıklarına bakılmaksızın 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 niyeti, ş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'sının temsil ettiği verileri okuma veya bu verilere yazma.
  • URI yetkilisiyle eşleşen içerik sağlayıcısını içeren uygulama hakkında 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 amaç 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ülemeyen bir hizmetle etkileşime girmesi gerekiyorsa uygun amaç 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 bir metin okuma (TTS) motoruyla etkileşime giriyorsa 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.TTS_SERVICE" />
</intent>

Konuşma tanıma hizmetine bağlanma

Uygulamanız bir konuşma tanıma hizmetiyle etkileşimde bulunuyorsa 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.speech.RecognitionService" />
</intent>

Medya tarayıcı hizmetlerine bağlanın

Uygulamanız bir istemci medya tarayıcı uygulamasıysa aşağıdaki <intent> öğesini manifest dosyanıza <queries> öğesinin parçası olarak ekleyin:

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

Özel işlevler sağlayın

Uygulamanızın özelleştirilebilir işlemler gerçekleştirmesi veya diğer uygulamalarla olan etkileşimlerine dayalı olarak özelleştirilebilir bilgiler göstermesi gerekiyorsa bu özel davranışı, manifest dosyanızdaki <queries> öğesinin bir parçası olarak amaç filtresi imzalarını kullanarak temsil edebilirsiniz. Aşağıdaki bölümlerde bazı sık karşılaşılan 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, hangi uygulamanın cihazın varsayılan SMS işleyicisi olduğunu kontrol etmek için) 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.SENDTO"/>
  <data android:scheme="smsto" android:host="*" />
</intent>

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

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ıza <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ını derleme süreci (ör. queryIntentActivities() çağrısı), Android'in 11'den önceki sürümleriyle karşılaştırıldığında değişmez.

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

Kullanıcılar uygulamanızda metin seçtiğinde, metin seçimi araç çubuğu seçilen metin üzerinde gerçekleştirilecek olası işlemler grubunu gösterir. Bu araç çubuğu diğer uygulamalardan özel işlemleri gösteriyorsa 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.PROCESS_TEXT" />
  <data android:mimeType="text/plain" />
</intent>

Bir kişi için ö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. contacts.xml dosyasını diğer uygulamalardan okuyun.
  2. Özel MIME türüne karşılık gelen bir simge yükleyin.

Uygulamanız kişiler uygulaması ise manifest dosyanızdaki <queries> öğesinin bir 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>