Получайте простые данные из других приложений

Так же, как приложение может отправлять данные другим приложениям, оно может также получать данные из других приложений. Подумайте о том, как пользователи взаимодействуют с вашим приложением и какие типы данных вы хотите получать от других приложений. Например, приложение социальной сети может быть заинтересовано в получении текстового контента, например, интересного веб-URL, из другого приложения.

Пользователи других приложений часто отправляют данные в ваше приложение через Android Sharesheet или Intent resolver. Приложения, отправляющие данные в ваше приложение, должны установить тип MIME для этих данных. Ваше приложение может получать данные, отправленные другим приложением, следующими способами:

  • Activity с соответствующим тегом intent-filter в манифесте
  • Поделиться ярлыками, опубликованными вашим приложением.

Цели Direct Share — это глубокие ссылки на определенную активность в вашем приложении. Они часто представляют человека или группу, и Android Sharesheet показывает их. Например, приложение для обмена сообщениями может предоставить цель Direct Share для человека, которая напрямую ссылается на разговор с этим человеком. Подробные инструкции см. в разделе Предоставление целей Direct Share .

Поддержка типов MIME

В идеале приложение должно иметь возможность получать максимально широкий диапазон типов MIME. Например, приложение для обмена сообщениями, предназначенное для отправки текста, изображений и видео, в идеале поддерживает прием text/* , image/* и video/* . Вот несколько распространенных типов MIME для отправки и получения простых данных в Android.

Получатели регистрируются для Отправители отправляют
text/*
  • text/plain
  • text/rtf
  • text/html
  • text/json
`image/*`
  • image/jpg
  • image/png
  • image/gif
video/*
  • video/mp4
  • video/3gp
Поддерживаемые расширения файлов application/pdf

Обратитесь к официальному реестру типов медиа MIME IANA .

Создавайте отличные цели для обмена

Когда пользователь нажимает на цель поделиться, связанную с определенным действием, он должен иметь возможность подтвердить и отредактировать общий контент перед его использованием. Это особенно важно для текстовых данных.

Получать данные с активностью

Получение данных с помощью действия включает обновление вашего манифеста, обработку входящего контента и обеспечение того, чтобы пользователь распознавал ваше приложение.

Обновите свой манифест

Фильтры намерений информируют систему о том, какие намерения принимает компонент приложения. Подобно тому, как вы создали намерение с действием ACTION_SEND в уроке Отправка простых данных в другие приложения , вы создаете фильтры намерений для получения намерений с этим действием. Вы определяете фильтр намерений в своем манифесте с помощью элемента <intent-filter> . Например, если ваше приложение обрабатывает получение текстового контента, манифест, включающий одно или несколько изображений любого типа, будет выглядеть следующим фрагментом:

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

Когда другое приложение пытается поделиться любой из этих вещей, создавая намерение и передавая его в startActivity() , ваше приложение отображается как опция в Android Sharesheet или Intent resolver. Если пользователь выбирает ваше приложение, это запускает соответствующую активность ( .ui.MyActivity в предыдущем примере). Затем вам нужно будет обработать содержимое соответствующим образом в вашем коде и пользовательском интерфейсе.

Обработка входящего контента

Чтобы обработать содержимое, предоставленное Intent , вызовите getIntent() для получения объекта Intent . Получив объект, вы можете изучить его содержимое, чтобы определить, что делать дальше. Если это действие можно запустить из других частей системы (например, из средства запуска), учтите это при изучении намерения.

Будьте особенно внимательны, проверяя входящие данные, вы никогда не знаете, что может отправить вам другое приложение. Например, может быть установлен неправильный тип MIME или отправляемое изображение может быть очень большим. Также не забывайте обрабатывать двоичные данные в отдельном потоке, а не в основном потоке («UI»).

Котлин

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
    }
}

Ява

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
    }
}

Обновление пользовательского интерфейса после получения данных может быть таким же простым, как заполнение EditText , или может быть более сложным, например, применение интересного фотофильтра к изображению. Что произойдет дальше, зависит от вашего приложения.

Убедитесь, что пользователи узнают ваше приложение

Ваше приложение представлено его значком и меткой в ​​Android Sharesheet и Intent resolver. Оба они определены в манифесте. Вы можете задать метки фильтра активности или намерения, чтобы предоставить больше контекста.

Начиная с Android 10 (уровень API 29), Android Sharesheet использует только значки, установленные в манифесте вашего тега application . Android игнорирует значки, установленные в тегах intent-filter и activity .