Я создаю приложение для 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 ✗ (неверно!)
Вывод 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?
Дополнительные ресурсы
Полный код воспроизведения: https://gist.github.com/fchevitarese/d1 ... 6e95f607d0
Связанная проблема с Chromium: https://issues.chromium.org/issues/457625191
Подробнее здесь: https://stackoverflow.com/questions/798 ... re-actions
Мобильная версия