Diğer uygulamalardan basit veriler alma

Bir uygulama, diğer uygulamalara veri gönderebildiği gibi diğer uygulamalardan da veri alabilir için de geçerlidir. Kullanıcıların uygulamanızla nasıl etkileşim kurduğunu ve hangi verilerle ilişkili olduğunu düşünün almak istediğiniz türlerdir. Örneğin, sosyal bir ağ uygulaması, başka bir uygulamadaki ilginç bir web URL'si.

Diğer uygulamaların kullanıcıları Android üzerinden uygulamanıza sıklıkla veri gönderiyor Sharesheet veya intent çözümleyici. Uygulamanıza veri gönderen uygulamalar, MIME türüdür. Uygulamanız başka bir uygulama tarafından gönderilen verileri şurada alabilir: şu yöntemleri kullanabilirsiniz:

  • Manifest'te eşleşen intent-filter etiketine sahip bir Activity
  • Uygulamanız tarafından yayınlanan Kısayollar paylaşılıyor.

Doğrudan Paylaşım hedefleri, uygulamanızdaki belirli bir etkinliğe ait derin bağlantılardır. Genellikle bir kişiyi veya grubu temsil ederler ve Android Sharesheet bunları gösterir. Örneğin, bir mesajlaşma uygulaması, bir kullanıcı için doğrudan paylaşım hedefi sağlayabilir. derin bağlantıları kullanarak söz konusu kişiyle sohbet edebilirsiniz. Görüntüleyin Ayrıntılı paylaşım için Doğrudan Paylaşım hedefleri sağlayın bakın.

Destek MIME türleri

İdeal olarak, bir uygulama mümkün olan en geniş MIME türü aralığını alabiliyor olmalıdır. Örneğin kısa mesaj, resim ve video göndermek için tasarlanmış bir mesajlaşma uygulaması ideal olarak text/*, image/* ve video/* almayı destekler. Aşağıda birkaç örnek verilmiştir yaygın olarak kullanılan MIME türleri.

Alıcılar Gönderenler gönderdiği
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 kayıt otoritesine (IANA) bakın.

Mükemmel paylaşım hedefleri oluşturun

Kullanıcı belirli bir etkinlikle ilişkili paylaşım hedefine dokunduğunda paylaşılan içeriği kullanmadan önce onaylayıp düzenleyebilmelidir. Bu özellikle de metin verileri için önemlidir.

Etkinlikle birlikte veri alma

Bir etkinlikle veri alma işlemi, manifest dosyanızı güncellemeyi, ve kullanıcının uygulamanızı tanımasını sağlamak gibi görevleri de bulunur.

Manifest dosyanızı güncelleme

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

<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, bir ve bunu startActivity(), uygulamanız için özelliğinin, Android Sharesheet veya intent çözümleyicide seçenek olarak listelenmesi. Kullanıcı uygulamanızı seçtiğinde, ilgili etkinliği başlatır (.ui.MyActivity önceki örneğe bakın). Ardından, içeriği uygun şekilde yönetmek size kalmıştır bir kontrol listesidir.

Gelen içeriği işleme

Bir Intent tarafından yayınlanan içeriği işlemek için şu çağrıyı yapın: Intent nesnesini almak için getIntent(). Nesneyi aldıktan sonra ne yapılacağını belirlemek için içeriği inceleyebilirsiniz. Bu etkinlik başka bölümlerinden (başlatıcı gibi) başlatılabilir, göz önünde bulundurmalısınız.

Gelen verileri kontrol etmek için çok dikkatli olun. Başka ne olduğunu asla gönderebilir. Örneğin, yanlış MIME türü ayarlanmış olabilir veya gönderilen resim çok büyük olabilir. Ayrıca, ikili verileri işlemeyi ana ("UI") iş parçacığı yerine ayrı bir iş parçacığı içinde görüntülenir.

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 veya daha yüksek olabilir Örneğin, bir resme ilginç bir fotoğraf filtresi uygulamak gibi. Size daha sonra ne olacağını sorabilirsiniz.

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

Uygulamanız, icon ve Android'deki label Paylaşım sayfası ve amaç çözümleyici. Bunların her ikisi de manifest dosyasında tanımlanmıştır. Şunları yapabilirsiniz: daha fazla bağlam sağlamak için etkinlik veya amaç filtresi etiketleri ayarlayın.

Android 10 (API düzeyi 29) sürümünden itibaren, Android Sharesheet yalnızca application etiketinizdeki manifest dosyasına ekleyin. Android, etkin durumdaki simgeleri yoksayar intent-filter ve activity etiketleri.