Как обработать IntentSender createChooser без класса компонента получателя Intent - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь обработать 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() никогда не вызывается после нажатия пользователем выбора. Несколько вопросов:

  1. Почему это не работает? Что мне не хватает? Я как-то неправильно устанавливаю Intent или IntentFilter?
  2. Можно ли даже использовать динамический BroadcastReceiver для обработки IntentSender из createChooser? Если нет, как я могу создать статический BroadcastReceiver, который вызывает что-то, что происходит в MyFragment?

Ресурсы:

...