Doğrudan paylaşım hedefleri sağlama

Şekil 1: 1 tarafından gösterildiği şekilde Sharesheet'teki Doğrudan Paylaşım satırı

Doğrudan Paylaşım hedeflerini, diğer uygulamaların kullanıcılarının uygulamanızla URL'leri, resimleri veya diğer veri türlerini paylaşmalarını kolaylaştırmak için kullanın. Direct Share, kullanıcıların uygulamayı seçip kişiyi aramak zorunda kalmadan, mesajlaşma ve sosyal medya uygulamalarındaki kişileri doğrudan Android Sharesheet'te sunarak çalışır.

ShortcutManagerCompat, Paylaşım Kısayolları sağlayan ve kullanımdan kaldırılan ChooserTargetService API ile geriye dönük uyumlu olan bir AndroidX API'dir. Hem Paylaşım Kısayollarını hem de ChooserTargets öğesini yayınlamanın tercih edilen yöntemi budur. Talimatlar için bu sayfadaki Hem Paylaşım Kısayollarını hem deChooserTarget hedefleri sağlamak için AndroidX'i kullanma konusuna bakın.

Doğrudan Paylaşım hedeflerini yayınlama

Sharesheet Doğrudan Paylaşım satırı yalnızca Paylaşım Kısayolları API'sı tarafından sağlanan dinamik kısayolları görüntüler. Doğrudan Paylaşım hedeflerini yayınlamak için aşağıdaki adımları tamamlayın.

  1. Uygulamanızın XML kaynak dosyasında share-target öğelerini tanımlayın.

    <shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity">
        <data android:mimeType="text/plain" />
        <category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" />
    </share-target>
    </shortcuts>
    
  2. Uygulamanız ilk kullanıma hazırlanırken dinamik kısayolları önem derecesine göre sıralamak için setDynamicShortcuts kullanın.

    Dizinin düşük olması, önemin daha yüksek olduğunu gösterir. Bir iletişim uygulaması yapıyorsanız uygulamanızda görünen ve yenilik durumuna göre sıralanmış en çok yapılan görüşmeler olabilir. Eski kısayolları yayınlamayın; son 30 gün içinde kullanıcı etkinliği olmayan bir ileti dizisi eski olarak kabul edilir.

    Kotlin

    ShortcutManagerCompat.setDynamicShortcuts(myContext, listOf(shortcut1, shortcut2, ..))
    

    Java

    List<ShortcutInfoCompat> shortcuts = new ArrayList<>();
    shortcuts.add(shortcut1);
    shortcuts.add(shortcut2);
    ...
    ShortcutManagerCompat.setDynamicShortcuts(myContext, shortcuts);
    
    
  3. Bir iletişim uygulaması geliştiriyorsanız kullanıcı bir kişiye her mesaj gönderdiğinde veya mesaj gönderdiğinde pushDynamicShortcut üzerinden kısayol kullanımını hemen bildirin. Daha fazla bilgi için bu sayfadaki İletişim uygulamaları için kısayol kullanımını bildirme bölümüne bakın. Örneğin, actions.intent.SEND_MESSAGE özelliğiyle ShortcutInfoCompat.Builder#addCapabilityBinding kısayolunda özellik bağlamalarını belirterek kullanıcı tarafından gönderilen mesajlar için kullanımı raporlayın.

    Kotlin

    val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
      ...
      .setShortLabel(firstName)
      .setLongLabel(fullName)
      .setCategories(matchedCategories)
      .setLongLived(true)
    .addCapabilityBinding("actions.intent.SEND_MESSAGE").build()
    ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)
    

    Java

    ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
      ...
      .setShortLabel(firstName)
      .setLongLabel(fullName)
      .setCategories(matchedCategories)
      .setLongLived(true)
      .addCapabilityBinding("actions.intent.SEND_MESSAGE")
      .build();
    
    ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);
    
  4. Kullanıcı bir kişiyi silerse removeLongLivedShortcut özelliğini kullanın. Sistem hizmetleri tarafından önbelleğe alınıp alınmadığından bağımsız olarak kısayolu kaldırmak için tercih edilen yöntem budur. Aşağıdaki kod snippet'i, bunun nasıl yapılacağını gösteren bir örnek gösterir.

    Kotlin

    val deleteShortcutId = "..."
    ShortcutManagerCompat.removeLongLivedShortcuts(myContext, listOf(deleteShortcutId))
    

    Java

    String deleteShortcutId = "...";
    ShortcutManagerCompat.removeLongLivedShortcuts(
        myContext, Arrays.asList(deleteShortcutId));
    
    

Direct Share hedeflerinizin sıralamasını iyileştirin

Android Sharesheet'te sabit sayıda Doğrudan Paylaşım hedefi gösterilir. Bu öneriler sıralamaya göre sıralanır. Aşağıdakileri yaparak kısayollarınızın sıralamasını iyileştirebilirsiniz:

  • Tüm shortcutIds öğelerinin benzersiz olduğundan ve farklı hedefler için tekrar kullanılmadığından emin olun.
  • setLongLived(true) yöntemini çağırarak kısayolun uzun ömürlü olduğundan emin olun.
  • İleti dizisiyle ilgili kısayollar için, karşılık gelen kısayolları ShortcutManagerCompat.pushDynamicShortcut üzerinden yeniden yayınlayarak giden ve gelen mesajlara ilişkin kısayol kullanımını raporlayın. Ayrıntılar için bu sayfadaki İletişim uygulamaları için kısayol kullanımını bildirme bölümüne bakın.
  • Alakasız veya eski Doğrudan Paylaşım hedefleri (ör. kullanıcının son 30 gün içinde mesaj göndermediği kişiler) sağlamaktan kaçının.
  • SMS uygulamalarında, kısa kodlar veya spam potansiyeli olarak tanımlanan görüşmeler için kısayol sağlamaktan kaçının. Kullanıcıların bu görüşmeleri paylaşması pek olası değildir.
  • Kısayolu uygun mimeType özellikleriyle ilişkilendirmek için setCategories() numaralı telefonu arayın. Örneğin, bir SMS uygulamasında bu kişi RCS veya MMS için etkin değilse karşılık gelen kısayolu image/* ve video/* gibi metin olmayan MIME türleriyle ilişkilendiremezsiniz.
  • Belirli bir görüşmede, dinamik kısayol aktarıldıktan ve kullanım bildirildikten sonra kısayol kimliğini değiştirmeyin. Bu, kullanım verilerinin sıralama için saklanmasını sağlar.

Kullanıcı herhangi bir Doğrudan Paylaşım hedefine dokunursa uygulamanız, kullanıcıyı doğrudan hedefin konusu üzerinde işlem yapabileceği bir kullanıcı arayüzüne yönlendirmelidir. Kullanıcıya açıklayıcı bir kullanıcı arayüzü sunmayın ve kullanıcıları dokunulan hedefle alakasız bir kullanıcı arayüzüne yerleştirmeyin. Örneğin, bir mesajlaşma uygulamasında Doğrudan Paylaşım hedefine dokunduğunuzda, kullanıcı seçtiği kişiyle bir ileti dizisi görünümüne yönlendirilir. Klavye görünür ve mesaj, paylaşılan verilerle önceden doldurulmuştur.

Paylaşım Kısayolları API'sı

Android 10'dan (API düzeyi 29) itibaren ShortcutInfo.Builder, paylaşım hedefi hakkında ek bilgi sağlayan yöntemler ve geliştirmeler ekledi:

setCategories()
Android 10'dan itibaren, kategoriler paylaşma amaçlarını veya işlemlerini yönetebilen kısayolları filtrelemek için de kullanılmaktadır. Ayrıntılar için Paylaşım hedefi bildirme bölümüne bakın. Bu alan, paylaşım hedefleri olarak kullanılması istenen kısayollar için gereklidir.
setLongLived()

Bir kısayolun yayından kaldırıldığında veya uygulama tarafından görünmez olduğunda (dinamik ya da sabitlenmiş kısayol olarak) geçerli olup olmadığını belirtir. Uzun ömürlü bir kısayol, dinamik kısayol olarak yayından kaldırılmış olsa bile çeşitli sistem hizmetleri tarafından önbelleğe alınabilir.

Uzun ömürlü bir kısayol oluşturmak, sıralamasını iyileştirebilir. Ayrıntılar için En iyi sıralamayı alma konusuna bakın.

setShortLabel(), setLongLabel()

Belirli bir kişi için kısayol yayınlarken lütfen setLongLabel() alanında tam adını ve setShortLabel() dilinde de takma ad veya ad gibi bir kısa ad ekleyin.

GitHub'da Paylaşım Kısayolları yayınlama örneğini inceleyin.

Kısayol görüntüleri sağlayın

Paylaşım Kısayolu oluşturmak için setIcon() üzerinden bir resim eklemeniz gerekir.

Paylaşım Kısayolları sistem yüzeylerinde görünebilir ve yeniden şekillenebilir. Ayrıca, Android 7, 8 veya 9 sürümlerini (API düzeyleri 25, 26, 27 ve 28) çalıştıran bazı cihazlar arka plan olmadan yalnızca bit eşlem simgeleri görüntüleyebilir, bu da kontrastı önemli ölçüde azaltır. Kısayolunuzun beklendiği gibi göründüğünden emin olmak için IconCompat.createWithAdaptiveBitmap() kullanarak uyarlanabilir bir bit eşlem sağlayın.

Uyarlanabilir bit eşlemlerin uyarlanabilir simgeler için ayarlananla aynı yönergelere ve boyutlara uyduğundan emin olun. Bunu yapmanın en yaygın yolu, amaçlanan kare bit eşlemi 72x72 dp'ye ölçeklemek ve bunu 108x108 dp şeffaf bir tuval içinde ortalamaktır. Simgeniz şeffaf bölgeler içeriyorsa bir arka plan rengi eklemeniz gerekir; aksi halde, şeffaf bölgeler siyah görünür.

Belirli bir şekle maskelenmiş görüntüler sağlamayın. Örneğin, Android 10 (API düzeyi 29) öncesinde Doğrudan Paylaşım ChooserTarget'leri için bir çevreye maskelenmiş kullanıcı avatarları sağlamak yaygın bir hizmetti. Android Sharesheet ve Android 10'daki diğer sistem yüzeyleri artık şekil ve tema kısayol resimlerini şekillendiriyor. Paylaşım Kısayollarının sağlanmasında tercih edilen yöntem, ShortcutManagerCompat aracılığıyla, Direct Share ChooserTarget nesnelerini sizin için otomatik olarak çevrelere dönüştürür.

Paylaşım hedefi belirtme

Paylaşım hedefleri, statik kısayol tanımlarına benzer şekilde uygulamanın kaynak dosyasında bildirilmelidir. Diğer statik kısayol tanımlarıyla birlikte kaynak dosyasındaki <shortcuts> kök öğesinin içine paylaşım hedefi tanımları ekleyin. Her <share-targets> öğesi; paylaşılan veri türü, eşleşme kategorileri ve paylaşım amacını işleyecek hedef sınıf hakkında bilgiler içerir. XML kodu şuna benzer:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
  <share-target android:targetClass="com.example.android.sharingshortcuts.SendMessageActivity">
    <data android:mimeType="text/plain" />
    <category android:name="com.example.android.sharingshortcuts.category.TEXT_SHARE_TARGET" />
  </share-target>
</shortcuts>

Paylaşım hedefindeki veri öğesi, amaç filtresindeki veri spesifikasyonuna benzer. Her paylaşım hedefi birden fazla kategoriye sahip olabilir. Bunlar yalnızca bir uygulamanın yayınlanan kısayollarını paylaşım hedefi tanımlarıyla eşleştirmek için kullanılır. Kategoriler rastgele uygulama tanımlı değerlere sahip olabilir.

Kullanıcının Android Sharesheet'te yukarıdaki örnek hedef paylaşımla eşleşen Paylaşım Kısayolunu seçmesi durumunda, uygulama aşağıdaki paylaşım amacını alır:

Action: Intent.ACTION_SEND
ComponentName: {com.example.android.sharingshortcuts /
                com.example.android.sharingshortcuts.SendMessageActivity}
Data: Uri to the shared content
EXTRA_SHORTCUT_ID: <ID of the selected shortcut>

Kullanıcı, paylaşım hedefini başlatıcı kısayollarından açarsa uygulama, paylaşım kısayolunu Kısayol YöneticisiCompat'a eklerken oluşturulan amacı alır. Farklı bir amaç olduğundan Intent.EXTRA_SHORTCUT_ID kullanılamaz ve ihtiyacınız olursa kimliği manuel olarak iletmeniz gerekir.

İletişim uygulamaları için kısayol kullanımını bildir

Bir iletişim uygulaması geliştiriyorsanız hem giden hem de gelen mesajlara ilişkin kullanımı raporlayarak Android Sharesheet'te sıralamanızı iyileştirebilirsiniz. Bunu yapmak için kişiyi temsil eden görüşme kısayolunu ShortcutManagerCompat.pushDynamicShortcut üzerinden yeniden yayınlayın.

Kısayol kullanımı ve özellik bağlamaları Android 5.0 (API 21) ile geriye dönük uyumludur.

Giden iletiler için kısayol kullanımını bildirin

Kullanıcı tarafından gönderilen mesajların raporlanması işlevsel olarak bir mesaj oluşturulduktan sonra "gönder" düğmesini tıklamaya benzer.

Kullanım raporlamasını tetiklemek için actions.intent.SEND_MESSAGE özelliğiyle ShortcutInfoCompat.Builder#addCapabilityBinding kısayolunda özellik bağlamalarını belirtin.

Kotlin

val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(firstName)
  .setLongLabel(fullName)
  .setCategories(matchedCategories)
  .setLongLived(true)
.addCapabilityBinding("actions.intent.SEND_MESSAGE").build()
ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

Java

ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(firstName)
  .setLongLabel(fullName)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.SEND_MESSAGE")
  .build();

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);

Giden mesaj bir grup sohbeti içinse recipient türü özellikle ilişkili olduğundan Audience parametre değerini de eklemeniz gerekir.

Kotlin

val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(groupShortTitle)
  .setLongLabel(groupLongTitle)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", listOf("Audience")).build()

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

Java

ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(groupShortTitle)
  .setLongLabel(groupLongTitle)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.SEND_MESSAGE", "message.recipient.@type", Arrays.asList("Audience"))
  .build();

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);

Gelen iletiler için kısayol kullanımını bildirin

Kullanıcı SMS, sohbet mesajı, e-posta veya bildirim gibi bir mesaj aldığında kullanım raporlamasını tetiklemek için actions.intent.RECEIVE_MESSAGE özelliğiyle ShortcutInfoCompat.Builder#addCapabilityBinding kısayol üzerinden özellik bağlamalarını da belirtmeniz gerekir.

Kotlin

val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(firstName)
  .setLongLabel(fullName)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE").build()

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

Java

ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(firstName)
  .setLongLabel(fullName)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE")
  .build();

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);

Gelen mesaj bir grup sohbetinden geliyorsa sender türü özellikle ilişkili olduğundan Audience parametre değerini de eklemeniz gerekir.

Kotlin

val shortcutInfo = ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(groupShortTitle)
  .setLongLabel(groupLongTitle)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE", "message.sender.@type", listOf("Audience")).build()

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo)

Java

ShortcutInfoCompat shortcutInfo = new ShortcutInfoCompat.Builder(myContext, staticConversationIdentifier)
  ...
  .setShortLabel(groupShortTitle)
  .setLongLabel(groupLongTitle)
  .setCategories(matchedCategories)
  .setLongLived(true)
  .addCapabilityBinding("actions.intent.RECEIVE_MESSAGE", "message.sender.@type", Arrays.asList("Audience"))
  .build();

ShortcutManagerCompat.pushDynamicShortcut(myContext, shortcutInfo);

Hem Paylaşım Kısayolları hem de Seçici Hedefleri sağlamak için AndroidX'i kullanın

AndroidX uyumluluk kitaplığıyla çalışabilmek için uygulamanın manifest dosyası, meta veri seçici hedef hizmeti ve amaç filtreleri grubunu içermelidir. Mevcut ChooserTargetService Direct Share API'sini inceleyin.

Bu hizmet, uyumluluk kitaplığında zaten tanımlanmıştır. Dolayısıyla kullanıcının, hizmeti uygulamanın manifest dosyasında beyan etmesi gerekmez. Ancak, paylaşım etkinliğinden hizmete olan bağlantı, seçici hedef sağlayıcı olarak dikkate alınmalıdır.

Aşağıdaki örnekte, AndroidX'te zaten tanımlanmış olan ChooserTargetService uygulaması androidx.core.content.pm.ChooserTargetServiceCompat işlevidir:

<activity
    android:name=".SendMessageActivity"
    android:label="@string/app_name"
    android:theme="@style/SharingShortcutsDialogTheme">
    <!-- This activity can respond to Intents of type SEND -->
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <!-- Only needed if you import the sharetarget AndroidX library that
         provides backwards compatibility with the old DirectShare API.
         The activity that receives the Sharing Shortcut intent needs to be
         taken into account with this chooser target provider. -->
    <meta-data
        android:name="android.service.chooser.chooser_target_service"
        android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
</activity>

Kısayolları Paylaşma SSS

Kısayol kullanım verileri nasıl saklanıyor ve cihazdan ayrılıyor mu?

Kısayollar tamamen cihaz üzerinde, şifrelenmiş bir disk bölümünde sistem verileri dizininde depolanır. Kısayollardaki simge, amaç, kişi ve kaynak adları gibi bilgilere yalnızca sistem hizmetleri ve kısayolları yayınlayan uygulama erişebilir.

Doğrudan Paylaşım geçmişi nedir?

Uygulamaların bir ChooserTargetService aracılığıyla ChooserTarget nesneleri sağlamasına izin vermek için Android 6.0'da (API düzeyi 23) Doğrudan Paylaşım özelliğini kullanıma sunduk. Sonuçlar isteğe bağlı olarak tepkisel olarak alındı ve bu da hedefler için yavaş bir yükleme süresine neden oldu.

Android 10'da (API düzeyi 29) ChooserTargetService Doğrudan Paylaşım API'lerini yeni Paylaşım Kısayolları API'si ile değiştirdik. Paylaşım Kısayolları API'si, sonuçları istek üzerine reaktif olarak almak yerine uygulamaların Doğrudan Paylaşım hedeflerini önceden yayınlamasını sağlar. Bu, ShareSheet'i hazırlarken Doğrudan Paylaşım hedeflerini alma sürecini hızla hızlandırdı. ChooserTargetService Doğrudan Paylaşım mekanizması çalışmaya devam eder ancak sistem, bu şekilde sağlanan hedefleri Paylaşım Kısayolları API'sini kullanan tüm hedeflerden daha düşük bir sıraya sokar.

Android 11 (API düzeyi 30), ChooserTargetService hizmetini kullanımdan kaldırmıştır ve Paylaşım Kısayolları API'si, Doğrudan Paylaşım hedeflerini sağlamanın tek yoludur.

Paylaşım hedefleri için yayınlanan kısayolların, başlatıcı kısayollarından (başlatıcıda uygulama simgelerine uzun süre basıldığında kısayolların tipik kullanımı) farkı nedir?

"Paylaşım hedefi" için yayınlanan tüm kısayollar aynı zamanda bir başlatıcı kısayoludur ve uygulamanızın simgesine uzun süre basıldığında menüde gösterilir. Etkinlik başına maksimum kısayol sayısı sınırı, bir uygulamanın yayınladığı toplam kısayol sayısı için de geçerlidir (hedefleri ve eski başlatıcı kısayollarını birlikte paylaşın).

Bir kullanıcının yayınlaması gereken paylaşım kısayolu sayısı konusunda nasıl bir yönlendirme vardır?

Paylaşım kısayollarının sayısı, getMaxShortcutCountPerActivity(android.content.Context) aracılığıyla kullanılabilen dinamik kısayollarla aynı sınırla sınırlıdır. Bu sınıra istinaden herhangi bir sayı yayınlanabilir. Ancak paylaşım kısayollarının, uygulama başlatıcıya uzun basıldığında ve paylaşım sayfasında görülebileceği unutulmamalıdır. Uzun basıldığında kullanılan çoğu uygulama başlatıcısı, dikey modda en fazla dört veya beş, yatay modda en fazla sekiz kısayol görüntülenir. Kısayolları paylaşma hakkında daha fazla bilgi ve yardım için bu SSS sayfasına göz atın.