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

Так же, как ваше приложение может отправлять данные в другие приложения, оно может легко получать данные из других приложений. Подумайте о том, как пользователи взаимодействуют с вашим приложением, и какие типы данных вы хотите получать от других приложений. Например, приложение для социальных сетей, вероятно, будет заинтересовано в получении текстового контента из другого приложения, такого как интересный веб-адрес. Приложение Google+ для Android принимает текст и одного или несколько изображений. С помощью этого приложения, пользователь может легко создать новую запись в Google+ с фотографиями из Android приложения Галерея.

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

Фильтры намерений сообщают системе, какие намерения компонент приложения готов принять. Подобно тому, как вы построили намерение с действием 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(), ваше приложение будет перечислено в качестве опции в диалоге выбора. Если пользователь выбирает выше приложение, соответствующая деятельность(.ui.MyActivity в приведенном выше примере) будет запущена. Именно тогда вам необходимо обработать контент соответствующим образом в вашем коде и пользовательском интерфейсе.

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

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

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

Внимание: Будьте особенно осторожны проверяя входные данные, вы никогда не знаете, что другие приложения могут вам отправить. Например, неправильный MIME тип может быть установлен, или отправленное изображение может быть чрезвычайно большим. Кроме того, помните о том, что обрабатывать двоичные данные лучше в отдельном потоке, а не основной потоке пользовательского интерфейса.

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