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şim kurduğu birkaç yaygın kullanım alanı sunulmaktadır. Her bölümde, uygulamanın işlevlerini sınırlı paket görünürlüğüyle nasıl gerçekleştireceğinizle ilgili yol gösterici bilgiler verilmektedir. Uygulamanız Android 11 (API düzeyi 30) veya sonraki sürümleri hedefliyorsa bu bilgileri dikkate almanız gerekir.

Android 11 veya sonraki sürümleri hedefleyen bir uygulama, başka bir uygulamada etkinlik başlatmak için intent kullanıyorsa en basit yaklaşım, intent'i çağırmak ve kullanılabilir uygulama yoksa ActivityNotFoundException istisnasını işlemektir.

Uygulamanızın bir bölümü, startActivity() çağrısının başarılı olup olmayacağını bilmeye bağlıysa (ör. kullanıcı arayüzü gösterme) 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ç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 intent kullanın. Bu intent'i 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, URL'yi derin bağlantı olarak destekleyen bir uygulamada açılır.
  • Kullanıcının URL'yi hangi uygulamanın açacağını seçmesine olanak tanıyan bir anlam belirsizliğini giderme iletişim kutusu görünür.
  • Cihazda URL'yi açabilecek bir uygulama yüklü olmadığından ActivityNotFoundException oluşur. (Bu olağan dışı bir durumdur.)

    Uygulamanızın, gerçekleşmesi durumunda ActivityNotFoundException hatasını 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 değişiklik yapmanız gerekmez. Bu durum, URL açan hem dolaylı hem de doğrudan intent'ler 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ı bulunduğunu veya belirli bir tarayıcının varsayılan tarayıcı olduğunu doğrulamak isteyebilir. Bu 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() yöntemini çağırıp bağımsız değişken olarak bir web intent'i 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 listede tarayıcı uygulamaları yer almaz.

URL'leri özel sekmelerde açma

Özel Sekmeler, bir uygulamanı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 özel sekmede URL açabilirsiniz.

Ancak cihazda Özel Sekmeler'i destekleyen bir tarayıcı olup olmadığını kontrol etmek veya CustomTabsClient.getPackageName() kullanarak Özel Sekmeler ile başlatılacak belirli bir tarayıcı seçmek isteyebilirsiniz. Bu 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.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 tarayıcı olmayan bir uygulamanın URL'yi açmasına izin vermeniz önerilir. Bu özelliği uygulamanızda sunmak için FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işaretini ayarlayan bir intent kullanarak startActivity() yöntemini çağırmayı deneyin. Sistem ActivityNotFoundException hatası verirse uygulamanız URL'yi ö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 hatasının verilmesine neden olur:

  • Çağrı, doğrudan bir tarayıcı uygulaması başlatır.
  • Bu çağrı, kullanıcıya yalnızca tarayıcı uygulamalarının seçenek olarak sunulduğu bir anlam belirsizliğini giderme iletişim kutusu gösterirdi.

Aşağıdaki kod snippet'i, mantığınızı FLAG_ACTIVITY_REQUIRE_NON_BROWSER intent işaretini kullanacak şekilde 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);
}

Anlam belirsizliğini giderme iletişim kutusundan kaçınma

Kullanıcılar bir URL'yi açtığında gösterilebilecek anlam belirsizliğini giderme iletişim kutusunun gösterilmesini önlemek ve bu gibi durumlarda URL'yi kendiniz işlemek istiyorsanız FLAG_ACTIVITY_REQUIRE_DEFAULT intent işaretini ayarlayan bir intent kullanabilirsiniz.

Bir intent bu işareti içeriyorsa startActivity() çağrısı, kullanıcıya anlam belirsizliğini giderme iletişim kutusu gösterileceği zaman ActivityNotFoundException hatasının verilmesine 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 hatasının oluşmasına neden olur:

  • Çağrı, tarayıcı uygulamasını doğrudan başlatır.
  • Arama, kullanıcıya anlam belirsizliğini giderme iletişim kutusu gösterirdi.

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çma

Uygulamanız dosya veya eklerle ilgili işlemler yapıyorsa (ör. bir cihazın belirli bir dosyayı açıp açamayacağını kontrol etme) genellikle en kolay yöntem, dosyayı işleyebilecek bir etkinlik başlatmayı denemektir. Bunun için ACTION_VIEW intent işlemini ve belirli dosyayı temsil eden URI'yi içeren bir intent kullanın. Cihazda kullanılabilir uygulama yoksa uygulamanız ActivityNotFoundException hatası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 manifest dosyanızdaki <queries> öğesinin bir parçası olarak aşağıdaki kod snippet'ine <intent> öğesini ekleyin. Derleme sırasında dosya türünü biliyorsanız bunu da 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() yöntemini çağırarak bir uygulamanın kullanılabilir olup olmadığını kontrol edebilirsiniz.

URI erişimi verme

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

  • Verilen URI izinlerine bağlı olarak, içerik URI'sinin temsil ettiği verileri okuma veya bu verilere yazma
  • URI yetkilisiyle eşleşen içerik sağlayıcıyı barındıran uygulamayı görünür hale getirin. İçerik sağlayıcıyı içeren uygulama, intent'i 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österir:

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ünür olmayan bir hizmetle etkileşim kurması gerekiyorsa uygun intent işlemini bir <queries> öğesi içinde tanımlayabilirsiniz. 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ş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.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ğlanma

Uygulamanız bir istemci medya tarayıcı uygulamasıysa 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 sağlama

Uygulamanızın, diğer uygulamalarla etkileşimlerine göre özelleştirilebilir işlemler gerçekleştirmesi veya özelleştirilebilir bilgiler göstermesi gerekiyorsa bu özel davranışı, manifestinizdeki <queries> öğesinin bir parçası olarak intent filtresi imzalarını kullanarak temsil edebilirsiniz. Aşağıdaki bölümlerde, sık karşılaşılan birkaç senaryoyla ilgili ayrıntılı bilgiler verilmiştir.

SMS uygulamalarını sorgulama

Uygulamanızın, cihazda yüklü SMS uygulamaları hakkında bilgi edinmesi 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 değişmeden kalır.

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

Kullanıcılar uygulamanızda metin seçtiğinde, metin seçimi araç çubuğu, seçilen metinde gerçekleştirilebilecek olası işlemleri gösterir. Bu araç çubuğu diğer uygulamalardan özel işlemler 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şinin özel veri satırlarını gösterme

Uygulamalar, Contacts Provider'a özel veri satırları ekleyebilir. Kişiler uygulamasının bu özel verileri gösterebilmesi için aşağıdakileri yapabilmesi gerekir:

  1. Diğer uygulamalardaki contacts.xml dosyasını okuyabilir.
  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 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>