Моя цель состоит в том, чтобы загружать файлы с службой (пожалуйста, вы можете предложить лучший вариант) в фоновом режиме без необходимости взаимодействия с приложением, чтобы можно было инициировать загрузку ( startService) всякий раз, когда он получает сообщение о том, что новый текст был скопирован в буфер обмена, и текст имеет загружаемое расширение.
В приведенной ниже реализации используется PR Downloader (Библиотека) для загрузкифайл, но файл не загружен.
Обычно я получаю сообщение об ошибке, и я регистрирую ответ.
onError. isServerError = false. isConnectionError = true
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.package.name">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
...>
<activity
android:name=".Activities.MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<intent-filter>
...
</intent-filter>
</activity>
...
<service android:name=".DownloadService" />
</application>
</manifest>
MainActivity.kt
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val clipBoard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
clipBoard.addPrimaryClipChangedListener {
val primaryClip = clipBoard.primaryClip
if (primaryClip == null || primaryClip.itemCount > 0 && primaryClip.getItemAt(0).text == null)
return@addPrimaryClipChangedListener
val serviceIntent = Intent(this, DownloadService::class.java)
val clip = primaryClip.getItemAt(0).text.toString()
if (clip.contains(".mp3")) {
Log.d("MainActivity","$clip")
serviceIntent.putExtra(DOWNLOAD_URL_KEY, clip)
serviceIntent.putExtra(DOWNLOAD_FILE_NAME_KEY, getFileName(clip))
startService(serviceIntent)
}
}
}
}
DownloadService.kt
class DownloadService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val url = intent?.getStringExtra(DOWNLOAD_URL_KEY)
val fileName = intent?.getStringExtra(DOWNLOAD_FILE_NAME_KEY)
Log("onStartCommand. FileName = $fileName Download URL = $url")
if (url != null)
downoadFile(url, fileName)
return super.onStartCommand(intent, flags, startId)
}
fun downoadFile(download_url: String, fileName: String?) {
val dirPath ="/Music Downloader/$fileName.mp3"
val downloadId = PRDownloader.download(download_url, dirPath, fileName)
.build()
.setOnStartOrResumeListener {
}
.setOnPauseListener {}
.setOnCancelListener {}
.setOnProgressListener { progress ->
Log("Progress = ${((progress.currentBytes / progress.totalBytes) * 100) as Int}%")
}
.start(object : OnDownloadListener {
override fun onError(error: com.downloader.Error?) {
Log("onError. ServerError = ${error?.isServerError}. ConnectionError = ${error?.isConnectionError}")
}
override fun onDownloadComplete() {
Log("onDownloadComplete")
}
})
Log("dirPath = $dirPath, download_url = $download_url, Download ID = $downloadId")
}
}
Я также пытался использовать Fetch но тот же результат - файл не загружается.
Но я заметил, что получение и анализ файла JSON / Xml работают с VOLLEY (:) Я знаю, что это 2018. Я перейду на Retrofit, обещаю).
Пожалуйста, что я делаю не так?Как я могу загрузить файл с помощью службы.
ОБНОВЛЕНИЕ
Я попытался запустить код в основной деятельности, но он все еще не работал.Я тестирую с Android 8.1, и я думаю, что-то не так с библиотекой PR-Downloader
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
PRDownloader.initialize(getApplicationContext())
val download_url = "https://images.pexels.com/photos/658687/pexels-photo-658687.jpeg?cs=srgb&dl=beautiful-bloom-blooming-658687.jpg"
download(download_url)
}
fun downoad(url: String, fileName: String) {
val dirPath = "/File Downloader/" + fileName
val downloadId = PRDownloader.download(url, dirPath, fileName)
.build()
.setOnStartOrResumeListener {
}
.setOnPauseListener {}
.setOnCancelListener {}
.setOnProgressListener { progress ->
Log("Progress = ${((progress.currentBytes / progress.totalBytes) * 100) as Int}%")
}
.start(object : OnDownloadListener {
override fun onError(error: com.downloader.Error?) {
Log("onError. isServerError = ${error?.isServerError}. isConnectionError = ${error?.isConnectionError}")
}
override fun onDownloadComplete() {
Log("onDownloadComplete")
}
})
}