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

Bu belgede, bir uygulamanın diğer uygulamalarla etkileşime geçtiği çeşitli yaygın kullanım alanları sunulmaktadır. Her bölümde, sınırlı paket görünürlüğüyle uygulamanın işlevini nasıl yerine getireceğiniz konusunda yol gösterici bilgiler verilmektedir. Uygulamanız Android 11'i (API düzeyi 30) veya sonraki sürümleri hedefliyorsa bu bilgileri göz önünde bulundurmanız gerekir.

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

Uygulamanızın bir kısmı, kullanıcı arayüzü göstermek gibi startActivity() çağrısının başarılı olup olmayacağını bilmeye bağlıysa uygulamanızın manifest dosyasının <queries> öğesine bir öğe ekleyin. Bu genellikle bir <intent> öğesidir.

URL'leri açma

Bu bölümde, Android 11 veya sonraki sürümleri hedefleyen bir uygulamada URL'leri açmayla ilgili çeşitli yöntemler 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 intent kullanın. Bu intent'i kullanarak startActivity() işlevini ç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 belirsizlik giderme iletişim kutusu görüntülenir.
  • Cihazınızda URL'yi açabilecek bir uygulama yüklü olmadığından ActivityNotFoundException hatası oluşur. (Bu olağan dışı bir durumdur.)

    Uygulamanızın, ActivityNotFoundException oluştuğunda bunu 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 <queries> öğesi eklemeniz veya mevcut bir <queries> öğesinde herhangi bir değişiklik yapmanız gerekmez. Bu durum, URL açan hem örtülü hem de açık intent'ler için geçerlidir.

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

Bazı durumlarda uygulamanız, bir URL'yi açmayı denemeden ö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, manifest dosyanıza <queries> öğesinin 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() işlevini çağırıp bağımsız değişken olarak bir web intent'i ilettiğinizde, döndürülen listede bazı durumlarda mevcut tarayıcı uygulamaları yer alır. Kullanıcı URL'yi varsayılan olarak tarayıcı dışında bir uygulamada açılacak şekilde yapılandırdıysa liste tarayıcı uygulamalarını içermez.

URL'leri Özel Sekmelerde açma

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

Ancak cihazınızda Özel Sekmeler'i destekleyen bir tarayıcı olup olmadığını kontrol edebilir veya CustomTabsClient.getPackageName() simgesini kullanarak Özel Sekmeler ile açılacak belirli bir tarayıcı seçebilirsiniz. Bu 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ı dışı uygulamaların URL'leri işlemesine izin verme

Uygulamanız Özel Sekmeler'i kullanarak URL'leri açabilse bile mümkünse URL'leri tarayıcı dışında bir uygulamanın açmasına izin vermeniz önerilir. Uygulamanızda bu özelliği sağlamak için FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işaretini ayarlayan bir intent kullanarak startActivity() çağrısı yapmayı deneyin. Sistem ActivityNotFoundException döndürürse uygulamanız URL'yi Özel Sekme'de açabilir.

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

  • Arama doğrudan bir tarayıcı uygulaması başlatırdı.
  • Aramada, kullanıcıya yalnızca seçeneklerin tarayıcı uygulamaları olduğu bir anlamlandırma iletişim kutusu gösterilir.

Aşağıdaki kod snippet'inde, mantığınızın FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işaretini kullanacak şekilde nasıl güncelleneceği gösterilmektedir:

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

Anlam ayrımı iletişim kutusundan kaçının

Kullanıcıların bir URL'yi açtığında görebileceği anlamlandırma iletişim kutusunu göstermek istemiyorsanız ve bu durumlarda URL'yi kendiniz yönetmeyi tercih ediyorsanız FLAG_ACTIVITY_REQUIRE_DEFAULT intent işaretini ayarlayan bir intent kullanabilirsiniz.

Bir intent bu işareti içeriyorsa startActivity() çağrısı, çağrının kullanıcıya bir anlamlandırma iletişim kutusu göstereceği durumlarda ActivityNotFoundException 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 herhangi biri gerçekleştiğinde bir ActivityNotFoundException atılmasına neden olur:

  • Arama, doğrudan tarayıcı uygulamasını başlatırdı.
  • Aramada, kullanıcıya bir anlamlandırma iletişim kutusu gösterilir.

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 dosya veya ekleri (ör. bir cihazın belirli bir dosyayı açıp açamayacağını kontrol etme) yönetiyorsa genellikle dosyayı yönetebilecek bir etkinlik başlatmayı denemek en kolay yoldur. Bunun için ACTION_VIEW intent işlemini ve belirli dosyayı temsil eden URI'yi içeren bir intent kullanın. Cihazda hiçbir uygulama yoksa uygulamanız ActivityNotFoundException'yi yakalayabilir. İstisna işleme mantığınızda bir hata gösterebilir veya dosyayı kendiniz işlemeye çalışabilirsiniz.

Uygulamanızın, başka bir uygulamanın belirli bir dosyayı açıp açamayacağını önceden bilmesi gerekiyorsa aşağıdaki kod snippet'inde <intent> öğesini manifest'inizdeki <queries> öğesinin bir parçası olarak ekleyin. Derleme sırasında dosya türünü zaten biliyorsanız dosyayı 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, intent'inizle resolveActivity() çağrarak bir uygulamanın kullanılıp kullanılamadığını kontrol edebilirsiniz.

URI erişimi verme

Not: URI erişim izinlerinin bu bölümde açıklandığı şekilde beyan edilmesi, Android 11'i (API düzeyi 30) veya sonraki sürümleri hedefleyen uygulamalar için zorunludur ve hedef SDK sürümlerinden 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şebilmesi için uygulamanızın niyeti, aşağıdaki intent işaretlerinden birini veya 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, intent'i alan uygulamaya aşağıdaki özellikleri sağlar:

  • Belirtilen URI izinlerine bağlı olarak içerik URI'sinin temsil ettiği verileri okuyabilir veya bu verilere yazabilir.
  • URI yetkilisiyle eşleşen içerik sağlayıcıyı içeren uygulamada görünürlük elde edin. İçerik sağlayıcıyı içeren uygulama, intent'i gönderen uygulamadan farklı olabilir.

Aşağıdaki kod snippet'inde, 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ği gösterilmektedir:

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ğlanma

Uygulamanızın otomatik olarak görünmeyen bir hizmetle etkileşime geçmesi gerekiyorsa <queries> öğesinde uygun intent işlemini belirtebilirsiniz. Aşağıdaki bölümlerde, sık erişilen hizmetlerin kullanıldığı örnekler verilmiştir.

Metin okuma motoruna bağlanma

Uygulamanız bir metin okuma (TTS) motoruyla etkileşime geçiyorsa 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 ses tanıma hizmetiyle etkileşime geçiyorsa 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ı hizmetlerine bağlanma

Uygulamanız bir istemci medya tarayıcısı uygulaması ise 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.media.browse.MediaBrowserService" />
</intent>

Özel işlevler sunma

Uygulamanızın, diğer uygulamalarla olan etkileşimlerine göre özelleştirilebilir işlemler gerçekleştirmesi veya özelleştirilebilir bilgiler göstermesi gerekiyorsa bu özel davranışı, manifest dosyanızdaki <queries> öğesinin bir parçası olarak intent filtresi imzalarını kullanarak gösterebilirsiniz. Aşağıdaki bölümlerde, sık karşılaşılan çeşitli senaryolar için ayrıntılı talimatlar verilmektedir.

SMS uygulamaları için sorgu

Uygulamanızın, cihaza yüklenen SMS uygulamaları grubu hakkında bilgi alması gerekiyorsa (ör. cihazın varsayılan SMS işleyicisinin hangi uygulama 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 paylaşım sayfası oluşturma

Mümkün olduğunda sistem tarafından sağlanan bir paylaşım sayfası kullanın. Alternatif olarak, 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.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ı oluşturma süreci (ör. queryIntentActivities() çağrısı) Android 11'den önceki Android sürümlerine kıyasla aynı kalır.

Özel metin seçim işlemlerini gösterme

Kullanıcılar uygulamanızda metin seçtiğinde, seçilen metinde yapılabilecek işlemler metin seçim araç çubuğunda gösterilir. Bu araç çubuğunda diğer uygulamalardan özel işlemler gösteriliyorsa 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şi için özel veri satırlarını gösterme

Uygulamalar, Kişi Sağlayıcı'ya özel veri satırları ekleyebilir. Bir kişi uygulamasının bu özel verileri göstermesi için aşağıdakileri 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şi uygulamasıysa manifest dosyanıza <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>