#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")
}
}