Есть ли способ загрузить по локальной сети с помощью DownloadManager в Android?

#android #android-5.0-lollipop #lan #android-download-manager

#Android #android-5.0-lollipop #локальная сеть #android-download-manager

Вопрос:

Я разрабатываю приложение, которому необходимо воспроизвести список видео на Android TV. Сначала я воспроизводю видео путем потоковой передачи, одновременно начиная загрузку видео. Когда определенное видео уже загружено и именно его нужно воспроизвести, я использую этот загруженный видеофайл и проигрываю его. На устройствах (таких как планшет, который я использовал для тестирования), которые используют WIFI соединение, загружаются видео. Но телевизор, на котором мне нужно запустить мое приложение, использует подключение к локальной сети. Есть ли обходной путь для этой проблемы?

В настоящее время я начинаю свои загрузки именно так.

 public void startDownload(VideoAd videoAd) {
    String videoUrl = videoAd.getUrl();
    Uri uri = Uri.parse(videoUrl);

    Environment
            .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
            .mkdirs();

    lastDownload = dlMgr.enqueue(new DownloadManager.Request(uri)
                        .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |
                                DownloadManager.Request.NETWORK_MOBILE)
                        .setAllowedOverRoaming(false)
                        .setTitle("Downloading video ad")
                        .setDescription("Downloading " getVideoNameFromLink(videoUrl))
                        .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, getVideoNameFromLink(videoUrl)));


    videoAd.setDownloadId(lastDownload);
}
  

Это работает. Но проблема в том, что это не работает при подключениях к локальной сети.

Это то, что я в настоящее время использую в своем приложении.

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    networkArr = connMgr.getAllNetworks();

    Log.d(TAG, "networkArr len: " networkArr.length);
    for(Network n : networkArr){
        lblNetworks.setText(n.toString() "n");
    }
}else{
    // Use getAllNetworkInfo()
    NetworkInfo[] networkInfArr = connMgr.getAllNetworkInfo();

    for(NetworkInfo ni : networkInfArr){
        lblNetworks.setText(ni.toString() "n");
    }
}
  

На моем планшете работает Lollipop, и я получаю номер 103 . Я не могу попробовать это на телевизоре, потому что он находится в другом здании.

Ответ №1:

Одним из возможных решений является получение нужной сети и привязка вашего процесса к этой сети через диспетчер подключений. Смотрите bindProcessToNetwork. Вы можете получить необходимую сеть с помощью getAllNetworks (), перебрать их и проверить, соответствует ли информация о сети той, которую вы хотели бы.

Комментарии:

1. Привет. Я попробовал ваше решение, но я получаю только число из 3 цифр. Это правильно?

2. Можете ли вы уточнить? когда вы получаете 3 цифры? Может быть, опубликовать код?

Ответ №2:

Для телевизора ‘NETWORK_MOBILE’ не будет работать. Я бы предложил удалить его и попробовать с указанным ниже кодом:-

 lastDownload = dlMgr.enqueue(new DownloadManager.Request(uri)
                    .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI)
                    .setTitle("Downloading video ad")
                    .setDescription("Downloading " getVideoNameFromLink(videoUrl))
                    .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, getVideoNameFromLink(videoUrl)));
  

Если этот код работает для TV, вам нужно применить проверку (если это TV) и соответствующим образом обработать код.

Комментарии:

1. Ну, я просто использовал то, что нашел раньше. Спасибо. И наш Android TV на самом деле не является настоящим Android TV, но у меня есть способ выполнить проверку.

Ответ №3:

Я застрял с этой проблемой. но я решил это, но я кодирую на kotlin. Вы можете попробовать это.

  // request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI) // comment this and use code below
    request.setAllowedOverMetered(false) <---  

Я могу загрузить его через Ethernet.

PS. Мой английский не очень хорош, но я хочу вам помочь.

это мой код в kotlin.

 private fun startDownloading(path: String, urlFile: String, name: String, type: String) {
        // handle permission
        try {
            e(subTag,"Download ...")
            val url = urlFile
            val request = DownloadManager.Request(Uri.parse(url))
            //request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE)
            request.setAllowedOverMetered(false)
//        request.setTitle("Download")
//        request.setDescription("The file is downloading...")
            request.allowScanningByMediaScanner()
//        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
            request.setDestinationUri(Uri.fromFile(File("$path/$name.$type")))
            val manager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
            downloadId =  manager.enqueue(request)
        } catch (e: Exception) {
            e(subTag,"ERROR startDownloading >> $e")
        }
    }