Я пытаюсь обработать IntentSender
из Intent.createChooser()
, чтобы сделать что-то, когда пользователь выбирает приложение для обмена изображением. Большинство примеров, которые я нашел здесь (опубликовано ниже), требуют использования BroadcastReceiver
следующим образом :
Intent receiver = new Intent(context, MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT);
String type = "image/*";
Intent share = new Intent(Intent.ACTION_SEND);
share.setType(type);
share.putExtra(Intent.EXTRA_STREAM, awesome_photo_uri);
startActivity(Intent.createChooser(share, "some_title", pendingIntent.getIntentSender()));
Моя проблема с этим решением, находится в этой строке:
Intent receiver = new Intent(context, MyReceiver.class);
Конструктор Intent , используемый в этих примерах, требует, чтобы я создал статический класс MyReceiver
, поэтому у меня есть класс для передачи во второй аргумент конструктора. Но это вызывает проблему, потому что я бы хотел, чтобы BroadcastReceiver
onReceive
делал что-то в моем Фрагменте. Поэтому я бы предпочел динамически создать BroadcastReceiver
в моем Фрагменте.
Безрезультатно, я попробовал следующий обходной путь:
Внутри MyFragment.kt
:
private val receiver: BroadcastReceiver = getBroadcastReceiver()
private val intentFilter = IntentFilter("com.my.app.CHOOSER_ACTION")
override fun onResume() {
requireContext().registerReceiver(receiver, intentFilter)
super.onResume()
}
override fun onPause() {
requireContext().unregisterReceiver(receiver)
super.onPause()
}
private fun shareImage(imageFile: File) {
Intent().apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
action = Intent.ACTION_SEND
type = "image/*"
putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(
requireContext(),
"${myPackageName}.fileprovider",
imageFile
))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
val receiver = Intent("com.my.app.CHOOSER_ACTION")
val pendingIntent = PendingIntent.getBroadcast(requireContext(), 0, receiver, PendingIntent.FLAG_CANCEL_CURRENT)
startActivity(Intent.createChooser(this, "Share image using", pendingIntent.intentSender))
} else {
startActivity(Intent.createChooser(this, "Share image using"))
}
}
}
private fun getBroadcastReceiver() : BroadcastReceiver {
return object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
intent?.extras?.keySet()?.forEach {
Log.v("MyTest", "$it: ${intent.extras?.get(it)}")
}
doSomethingInMyFragment()
}
}
}
Внутри AndroidManifest.xml
:
<activity android:name="MyActivityThatHasMyFragment" />
<intent-filter>
<action android:name="com.my.app.CHOOSER_ACTION" />
</intent-filter>
</activity>
К сожалению, динамическая функция BroadcastReceiver
onReceive()
никогда не вызывается после нажатия пользователем выбора. Несколько вопросов:
- Почему это не работает? Что мне не хватает? Я как-то неправильно устанавливаю
Intent
или IntentFilter
?
- Можно ли даже использовать динамический
BroadcastReceiver
для обработки IntentSender
из createChooser
? Если нет, как я могу создать статический BroadcastReceiver
, который вызывает что-то, что происходит в MyFragment
?
Ресурсы: