Chrome Android повторно использует Intent.EXTRA_TEXT для нескольких действий с общим доступомAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Chrome Android повторно использует Intent.EXTRA_TEXT для нескольких действий с общим доступом

Сообщение Anonymous »

Проблема
Я создаю приложение для Android, которое получает общие URL-адреса из меню общего доступа Chrome. Приложение работает правильно с первым общим ресурсом, но все последующие получают тот же URL-адрес первого общего ресурса вместо URL-адреса текущей страницы.
Эта ошибка возникает только в Chrome. Firefox работает правильно.
Шаги по воспроизведению
  • Установите приложение Android с этим фильтром намерений:
  • Откройте Chrome и перейдите на https://www.example.com/page1
  • Нажмите «Поделиться» → выберите свое приложение
  • Перейдите на https://www.example.com/page2 в Chrome
  • Нажмите «Поделиться» → выберите то же приложение еще раз
Ожидаемое поведение
Каждый общий ресурс должен отправлять URL-адрес текущей страницы в Intent.EXTRA_TEXT:
  • Первый общий ресурс: EXTRA_TEXT = page1 ✓
  • Второй общий ресурс: EXTRA_TEXT = page2 ✓
Фактическое поведение
Chrome повторно использует URL-адрес из первого общего доступа:
  • Первый общий доступ: EXTRA_TEXT = page1 ✓
  • Второй общий доступ: EXTRA_TEXT = page1 ✗ (неверно!)
Но Intent.EXTRA_SUBJECT верен (содержит заголовок новой страницы).
Вывод Logcat

Код: Выделить всё

// First share - CORRECT
EXTRA_TEXT: https://www.example.com/page1 ✓
EXTRA_SUBJECT: Page 1 Title ✓
ClipData.text: null
ClipData.uri: content://.../screenshot.png

// Second share - WRONG
EXTRA_TEXT: https://www.example.com/page1 ✗ (reused!)
EXTRA_SUBJECT: Page 2 Title ✓ (correct)
ClipData.text: null
ClipData.uri: content://.../screenshot.png
Мой код

Код: Выделить всё

class MainActivity : FlutterActivity() {

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)  // Update intent reference
}

override fun onResume() {
super.onResume()
handleIntent(intent)
}

private fun handleIntent(intent: Intent?) {
if (Intent.ACTION_SEND == intent?.action && intent.type == "text/plain") {
val extraText = intent.getStringExtra(Intent.EXTRA_TEXT)
val extraSubject = intent.getStringExtra(Intent.EXTRA_SUBJECT)

Log.d("MainActivity", "EXTRA_TEXT: $extraText")
Log.d("MainActivity", "EXTRA_SUBJECT: $extraSubject")

// Attempted workaround: check ClipData
val clipData = intent.clipData
if (clipData != null && clipData.itemCount > 0) {
val clipText = clipData.getItemAt(0).text?.toString()
Log.d("MainActivity", "ClipData.text: $clipText")
// Always null in Chrome!
}
}
}
}
Что я пробовал
  • ✅ Реализован шаблон onNewIntent() + setIntent()
  • ✅ Протестировано с режимами запуска SingleTask, SingleTop и стандартным
  • ❌ Проверьте ClipData.text — всегда null в Chrome
  • ❌ Анализ из ClipData.uri – только путь к файлу снимка экрана
  • ❌ Дополнительные функции Clear Intent – Chrome по-прежнему кэширует значение
Тестовая среда
  • Android: 15
  • Chrome: 142.0.7444.48 (также проверено 131.0.6778.260)
  • Устройство: Xiaomi 23073RPBFG
  • Firefox: Работает корректно ✓
Вопросы
  • Есть это известная ошибка Chrome? Мне не удалось обнаружить никаких существующих проблем.
  • Есть ли обходной путь, позволяющий получить текущий URL-адрес из намерений Chrome?
Единственный обходной путь для пользователей — использовать «Копировать ссылку» вместо «Поделиться» или переключиться на Firefox.

Дополнительные ресурсы
Полный код воспроизведения: https://gist.github.com/fchevitarese/d1 ... 6e95f607d0
Связанная проблема с Chromium: https://issues.chromium.org/issues/457625191

Подробнее здесь: https://stackoverflow.com/questions/798 ... re-actions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»