Android / Kotlin - локальный BroadcastReceiver никогда не активируется DownloadManager - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь определить, когда загрузка DownloadManager завершена.К сожалению, локальный BroadcastReceiver, который я пытаюсь использовать, никогда не вызывается.Я видел несколько похожих вопросов, но ни один из них не решил мою проблему;Кроме того, если BroadcastReceiver не является локальным, но объявлен в манифесте, он вызывается, поэтому я не думаю, что это проблема с DownloadManager.

Я не могу использовать внешний BroadcastReceiver, потому что мне нужнообновите пользовательский интерфейс (точнее, откройте другое действие), когда загрузка будет завершена, и, насколько я знаю, это невозможно сделать с внешнего приемника (пожалуйста, исправьте меня, если я ошибаюсь).

Вызов DownloadManager:

private fun download() {
    val mobileNetSSDConfigRequest: DownloadManager.Request = DownloadManager.Request(
            Uri.parse("https://s3.eu-west-3.amazonaws.com/gotcha-weights/weights/MobileNetSSD/MobileNetSSD.prototxt")
    )
    mobileNetSSDConfigRequest.setDescription("Downloading MobileNetSSD configuration")
    mobileNetSSDConfigRequest.setTitle("MobileNetSSD configuration")

    mobileNetSSDConfigRequest.setDestinationInExternalPublicDir(
            "Android/data/giorgioghisotti.unipr.it.gotcha/files/weights/", "MobileNetSSD.prototxt")

    val manager: DownloadManager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
    manager.enqueue(mobileNetSSDConfigRequest)
}

, который вызывается при получении разрешений:

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    when (requestCode) {
        PERMISSION_REQUEST_CODE -> {
            if (grantResults.isEmpty()
                    || grantResults[0] != PackageManager.PERMISSION_GRANTED
                    || grantResults[1] != PackageManager.PERMISSION_GRANTED
                    || grantResults[2] != PackageManager.PERMISSION_GRANTED
                    || grantResults[3] != PackageManager.PERMISSION_GRANTED
                    || grantResults[4] != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this,
                        "Sorry, this app requires camera and storage access to work!",
                        Toast.LENGTH_LONG).show()
                finish()
            } else {
                val mobileSSDConfig = File(sDir + mobileNetSSDConfigPath)
                if (!mobileSSDConfig.exists()) download()
                else {
                    val myIntent = Intent(this, MainMenu::class.java)
                    this.startActivity(myIntent)
                }
            }
        }
    }
}

BroadcastIntent объявляется так (Splash - это имя действия):

private val broadcastReceiver = object: BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        when (intent?.action) {
            DownloadManager.ACTION_DOWNLOAD_COMPLETE -> {
                val myIntent = Intent(this@Splash, MainMenu::class.java)
                this@Splash.startActivity(myIntent)
            }
        }
    }
}

и зарегистрирован в методе onCreate () действия:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    LocalBroadcastManager.getInstance(this).registerReceiver(
            broadcastReceiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)
    )

    ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA,
            android.Manifest.permission.READ_EXTERNAL_STORAGE,
            android.Manifest.permission.INTERNET,
            android.Manifest.permission.ACCESS_NETWORK_STATE,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE), PERMISSION_REQUEST_CODE)
}

Я попытался зарегистрировать получателя в методе onResume и объявить его внутри метода onCreate, без изменений.Насколько я могу судить, я делаю это именно так, как я видел это в нескольких принятых ответах, и я не вижу проблемы.Я точно знаю, что BroadcastReceiver никогда не вызывается, я проверил отладку и все виды консольных журналов.Кажется, что DownloadManager работает должным образом, поскольку файл загружен правильно, а внешние службы вызываются правильно.

Чего мне не хватает?

1 Ответ

0 голосов
/ 02 апреля 2019

У меня была похожая проблема, и оказалось, что вызов просто registerReceiver(broadcastReceiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE), без получения экземпляра LocalBroadcastManager, решил проблему.

Возможно, проблема заключалась в том, что получатель регистрировался нанеправильный объект контекста.[не забудьте также позаботиться о снятии с регистрации получателя]

Я сделал это так

public void onResume() 
{
    super.onResume();
    registerReceiver(broadcastReceiver, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE))
}

public void onPause() 
{
    super.onPause();
    unregisterReceiver(broadcastReceiver);
}
...