Diğer uygulamalardan basit veriler alma

Uygulamalar diğer uygulamalara veri gönderebildiği gibi diğer uygulamalardan da veri alabilir. Kullanıcıların uygulamanızla nasıl etkileşimde bulunduğunu ve diğer uygulamalardan hangi veri türlerini almak istediğinizi düşünün. Örneğin, bir sosyal ağ uygulaması, ilgi çekici bir web URL'si gibi metin içeriği almak isteyebilir.

Diğer uygulamaların kullanıcıları, Android Paylaşım Sayfası veya intent çözümleyici aracılığıyla uygulamanıza sık sık veri gönderir. Uygulamanıza veri gönderen uygulamalar, bu veriler için bir MIME türü ayarlamalıdır. Uygulamanız, başka bir uygulama tarafından gönderilen verileri aşağıdaki yöntemlerle alabilir:

  • Manifestte eşleşen bir intent-filter etiketi içeren Activity
  • Uygulamanız tarafından yayınlanan kısayolların paylaşılması

Doğrudan Paylaşım hedefleri, uygulamanızdaki belirli bir Etkinlik'e giden derin bağlantılardır. Genellikle bir kişiyi veya grubu temsil ederler ve Android Paylaşım sayfasında gösterilirler. Örneğin, bir mesajlaşma uygulaması, bir kullanıcı için doğrudan paylaşım hedefi sağlayabilir. Bu hedef, kullanıcıyla doğrudan bir görüşmeye derin bağlantı verir. Ayrıntılı talimatlar için Doğrudan Paylaşım hedefleri sağlama başlıklı makaleyi inceleyin.

Desteklenen MIME türleri

İdeal olarak, bir uygulama mümkün olan en geniş MIME türü aralığını almalıdır. Örneğin, metin, resim ve video göndermek için tasarlanmış bir mesajlaşma uygulaması ideal olarak text/*, image/* ve video/*'yi destekler. Android'de basit verileri göndermek ve almak için kullanılan bazı yaygın MIME türleri aşağıda verilmiştir.

Alıcılar aşağıdakilere kaydolmalıdır: Gönderenler gönderir
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Desteklenen dosya uzantıları application/pdf

MIME medya türlerinin resmi IANA sicil defterine bakın.

Paylaşım için mükemmel hedefler belirleyin

Kullanıcılar, belirli bir etkinlikle ilişkili bir paylaşım hedefine dokunduklarında, paylaşılan içeriği kullanmadan önce onaylayabilir ve düzenleyebilir. Bu durum özellikle metin verileri için önemlidir.

Etkinlikle veri alma

Bir etkinlikle veri almak, manifestinizi güncellemeyi, gelen içeriği işlemeyi ve kullanıcının uygulamanızı tanımasını sağlamayı içerir.

Manifest dosyanızı güncelleme

Intent filtreleri, bir uygulama bileşeninin hangi intent'leri kabul ettiğini sisteme bildirir. Diğer uygulamalara basit veriler gönderme dersinde ACTION_SEND işlemiyle bir intent oluşturmanıza benzer şekilde, bu işlemle intent almak için intent filtreleri oluşturursunuz. Manifest dosyanızda <intent-filter> öğesini kullanarak bir intent filtresi tanımlarsınız. Örneğin, uygulamanız metin içeriği alıyorsa herhangi bir türde bir veya daha fazla resim içeren bir manifest aşağıdaki snippet'e benzer:

<activity android:name=".ui.MyActivity" >
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="image/*" />
    </intent-filter>
</activity>

Başka bir uygulama, intent oluşturup startActivity()'a ileterek bunlardan herhangi birini paylaşmaya çalıştığında uygulamanız Android Paylaşım Sayfası veya intent çözümleyicisinde seçenek olarak listelenir. Kullanıcı uygulamanızı seçerse ilgili etkinlik (önceki örnekte .ui.MyActivity) başlatılır. Ardından, içeriği kodunuzda ve kullanıcı arayüzünüzde uygun şekilde işlemek size bağlıdır.

Gelen içeriği işleme

Bir Intent tarafından yayınlanan içeriği işlemek için Intent nesnesini almak üzere getIntent() işlevini çağırın. Nesneyi aldıktan sonra, bir sonraki adımı belirlemek için içeriğini inceleyebilirsiniz. Bu etkinlik sistemin diğer bölümlerinden (ör. başlatıcı) başlatılabiliyorsa niyeti incelerken bunu göz önünde bulundurun.

Gelen verileri kontrol ederken çok dikkatli olun. Başka bir uygulamanın size ne gönderebileceğini bilemezsiniz. Örneğin, yanlış MIME türü ayarlanmış veya gönderilen resim çok büyük olabilir. Ayrıca, ikili verileri ana ("kullanıcı arayüzü") iş parçacığı yerine ayrı bir iş parçacığında işlemeyi unutmayın.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    when {
        intent?.action == Intent.ACTION_SEND -> {
            if ("text/plain" == intent.type) {
                handleSendText(intent) // Handle text being sent
            } else if (intent.type?.startsWith("image/") == true) {
                handleSendImage(intent) // Handle single image being sent
            }
        }
        intent?.action == Intent.ACTION_SEND_MULTIPLE
                && intent.type?.startsWith("image/") == true -> {
                handleSendMultipleImages(intent) // Handle multiple images being sent
        }
        else -> {
            // Handle other intents, such as being started from the home screen
        }
    }
    ...
}

private fun handleSendText(intent: Intent) {
    intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
        // Update UI to reflect text being shared
    }
}

private fun handleSendImage(intent: Intent) {
    (intent.getParcelableExtra<Parcelable>(Intent.EXTRA_STREAM) as? Uri)?.let {
        // Update UI to reflect image being shared
    }
}

private fun handleSendMultipleImages(intent: Intent) {
    intent.getParcelableArrayListExtra<Parcelable>(Intent.EXTRA_STREAM)?.let {
        // Update UI to reflect multiple images being shared
    }
}

Java

void onCreate (Bundle savedInstanceState) {
    ...
    // Get intent, action and MIME type
    Intent intent = getIntent();
    String action = intent.getAction();
    String type = intent.getType();

    if (Intent.ACTION_SEND.equals(action) && type != null) {
        if ("text/plain".equals(type)) {
            handleSendText(intent); // Handle text being sent
        } else if (type.startsWith("image/")) {
            handleSendImage(intent); // Handle single image being sent
        }
    } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
        if (type.startsWith("image/")) {
            handleSendMultipleImages(intent); // Handle multiple images being sent
        }
    } else {
        // Handle other intents, such as being started from the home screen
    }
    ...
}

void handleSendText(Intent intent) {
    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
    if (sharedText != null) {
        // Update UI to reflect text being shared
    }
}

void handleSendImage(Intent intent) {
    Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
    if (imageUri != null) {
        // Update UI to reflect image being shared
    }
}

void handleSendMultipleImages(Intent intent) {
    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    if (imageUris != null) {
        // Update UI to reflect multiple images being shared
    }
}

Verileri aldıktan sonra kullanıcı arayüzünü güncellemek, bir EditText doldurmak kadar basit veya bir resme ilginç bir fotoğraf filtresi uygulamak kadar karmaşık olabilir. Bundan sonraki işlemler uygulamanıza bağlıdır.

Kullanıcıların uygulamanızı tanımasını sağlayın

Uygulamanız, Android paylaşım sayfasında ve intent çözümleyicisinde simgesiyle ve etiketiyle temsil edilir. Her ikisi de manifest dosyasında tanımlanır. Daha fazla bağlam sağlamak için etkinlik veya intent filtresi etiketleri ayarlayabilirsiniz.

Android 10 (API düzeyi 29) itibarıyla Android paylaşım sayfası yalnızca application etiketinizdeki manifest dosyasında ayarlanan simgeleri kullanır. Android, intent-filter ve activity etiketlerinde ayarlanan simgeleri yoksayar.