Zengin içerik alma

Şekil 1. Birleştirilmiş API, yönetim işlemlerini tek bir yerden yapmanızı sağlar. belirli kullanıcı arayüzü mekanizmasından bağımsız olarak gelen içeriği (örneğin, yapıştırma gibi) dokunarak ve basılı tutun veya sürükleyip bırakın.

Kullanıcılar resimleri, videoları ve diğer etkileyici içerikleri sever, ancak Bu içerikleri uygulamalarda taşımak her zaman kolay olmuyor. Böylece, uygulamalarınızın Android 12 (API düzeyi 31) kullanıma sunulan birleşik bir API ile uygulamanızın pano, klavye veya sürükleme gibi herhangi bir kaynaktan içerik kabul etmesini sağlar.

Örneğin, OnReceiveContentListener herhangi bir bileşene içerik eklendiğinde geri çağırma mekanizmasıdır. Geri çağırma, kodunuzun işleyeceği tek yer haline gelir düz ve stil özellikleri ayarlanmış metinden işaretleme, resim, video, ses dosyaları ve diğerleri.

Önceki Android sürümleriyle geriye dönük uyumluluk için bu API ayrıca AndroidX'te mevcuttur, bu tarihten itibaren Core 1.7 ve Appcompat 1.4, bu işlevi uygularken kullanmanızı öneririz.

Genel Bakış

Mevcut diğer API'lerle her bir kullanıcı arayüzü mekanizması (ör. dokunma ve basılı tutma menüsü kendine karşılık gelen bir API'si vardır. Bunun için de her API ile ayrı ayrı entegre ederek, entegre edilemeyen her mekanizma için şu içeriği ekler:

Farklı işlemleri ve uygulanacak göreli API'yi gösteren resim
Şekil 2. Önceden, uygulamalar her kullanıcı arayüzü için farklı bir API uyguluyordu otomatik olarak üretilir.

OnReceiveContentListener API, bu farklı kod yollarını şunları yaparak bir araya getirir: Böylece, uygulamaya özel mantığınıza odaklanabilirsiniz. Gerisini platforma bırakın:

Basitleştirilmiş, birleştirilmiş API'yi gösteren resim
Şekil 3. Birleştirilmiş API, tek bir Tüm kullanıcı arayüzü mekanizmalarını destekleyen API.

Bu yaklaşım aynı zamanda, desteği etkinleştirmek için ek kod değişiklikleri yapmanız gerekmez. dokunun. Uygulamanızın bir kullanmaya devam ederseniz mevcut API'leri kullanmaya devam edebilirsiniz. aynı şekilde ele alacağız.

Uygulama

API, tek yöntem içeren bir işleyici arayüzüdür. OnReceiveContentListener. Android platformunun eski sürümlerini desteklemek için eşleşen OnReceiveContentListener AndroidX Core kitaplığındaki yeni arayüzü kullanın.

API'yi kullanmak için, dinleyiciyi, sitenizin ne tür içerikler şunları işleyebilir:

Kotlin

object MyReceiver : OnReceiveContentListener {
    val MIME_TYPES = arrayOf("image/*", "video/*")
    
    // ...
    
    override fun onReceiveContent(view: View, payload: ContentInfoCompat): ContentInfoCompat? {
        TODO("Not yet implemented")
    }
}

Java

public class MyReceiver implements OnReceiveContentListener {
     public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};
     // ...
}

Uygulamanızın desteklediği tüm içerik MIME türlerini belirttikten sonra dinleyicinin geri kalanına da yanıt verin:

Kotlin

class MyReceiver : OnReceiveContentListener {
    override fun onReceiveContent(view: View, contentInfo: ContentInfoCompat): ContentInfoCompat {
        val split = contentInfo.partition { item: ClipData.Item -> item.uri != null }
        val uriContent = split.first
        val remaining = split.second
        if (uriContent != null) {
            // App-specific logic to handle the URI(s) in uriContent.
        }
        // Return anything that your app didn't handle. This preserves the
        // default platform behavior for text and anything else that you aren't
        // implementing custom handling for.
        return remaining
    }

    companion object {
        val MIME_TYPES = arrayOf("image/*", "video/*")
    }
}

Java

 public class MyReceiver implements OnReceiveContentListener {
     public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};

     @Override
     public ContentInfoCompat onReceiveContent(View view, ContentInfoCompat contentInfo) {
         Pair split = contentInfo.partition(
                 item -> item.getUri() != null);
         ContentInfo uriContent = split.first;
         ContentInfo remaining = split.second;
         if (uriContent != null) {
             // App-specific logic to handle the URI(s) in uriContent.
         }
         // Return anything that your app didn't handle. This preserves the
         // default platform behavior for text and anything else that you aren't
         // implementing custom handling for.
         return remaining;
     }
 }

Uygulamanız amaçlar ile paylaşımı zaten destekliyorsa içerik URI'lerini işlemek için uygulamaya özel mantık. Kalan verileri şuraya geri döndür: bu verilerin işlenmesi için platforma yetki vermek.

İşleyiciyi uyguladıktan sonra, uygulamanız:

Kotlin

class MyActivity : Activity() {
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
        val myInput = findViewById(R.id.my_input)
        ViewCompat.setOnReceiveContentListener(myInput, MyReceiver.MIME_TYPES, MyReceiver())
    }
}

Java

public class MyActivity extends Activity {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         // ...

         AppCompatEditText myInput = findViewById(R.id.my_input);
         ViewCompat.setOnReceiveContentListener(myInput, MyReceiver.MIME_TYPES, new MyReceiver());
     }
}

URI izinleri

Okuma izinleri, tüm cihazlar için platform tarafından otomatik olarak verilir ve içerik URI'leri ile yük OnReceiveContentListener'e aktarılmıştır.

Normalde, uygulamanız bir hizmet veya etkinlikteki içerik URI'lerini işler. Örneğin, uzun süreli işleme, WorkManager değerleridir. Google Analytics 4'ü öğesini ekleyerek izinleri hedef hizmet veya etkinliğe içerik Intent.setClipData ve bayrağı ayarlama FLAG_GRANT_READ_URI_PERMISSION.

Alternatif olarak, örneğin mevcut bağlamda bir arka plan ileti dizisi işleyeceğiz. Bu durumda, İzinlerin uygulanmadığından emin olmak için dinleyici tarafından payload nesne alındı erken iptal edebileceğimiz anlamına gelir.

Özel görünümler

Uygulamanızda özel bir View alt sınıfı kullanılıyorsa OnReceiveContentListener atlanmaz.

View sınıfınız onCreateInputConnection yöntemini kullanmak için Jetpack API'yi InputConnectionCompat.createWrapper InputConnection öğesini yapılandırın.

View sınıfınız onTextContextMenuItem yöntemini kullanın, menü öğesi R.id.paste veya R.id.pasteAsPlainText

Klavye görüntüsü API'si ile karşılaştırma

OnReceiveContentListener API'yi, uygulamanızın Mevcut klavye görüntüsü API'sini kullanın. Bu birleştirilmiş API, klavye görüntüsü API'sinin işlevlerinin yanı sıra sunuyor. Cihaz ve özellik uyumluluğu ister Jetpack kitaplığını, ister Android SDK'sının yerel API'lerini kullanın.

Tablo 1. Şunlar için desteklenen özellikler ve API düzeyleri: Jetpack.
İşlem veya özellik Klavye görüntüsü API'si tarafından desteklenir Birleştirilmiş API tarafından desteklenir
Klavyeden ekleme Evet (API düzeyi 13 ve üstü) Evet (API düzeyi 13 ve üstü)
Dokunarak &yapıştırarak ekleyin basılı tutma menüsü Hayır Evet
Sürükleyip bırakarak ekleme Hayır Evet (API düzeyi 24 ve üstü)
Tablo 2. Yerel reklamlar için desteklenen özellikler ve API düzeyleri API'ler.
İşlem veya özellik Klavye görüntüsü API'si tarafından desteklenir Birleştirilmiş API tarafından desteklenir
Klavyeden ekleme Evet (API düzeyi 25 ve üstü) Evet (Android 12 ve sonraki sürümler)
Dokunarak &yapıştırarak ekleyin basılı tutma menüsü Hayır
Sürükleyip bırakarak ekleme Hayır