我正在创建一个应用程序,其中有一个按钮,当按下该按钮时,它将开始下载文件。该按钮位于RecyclerView
上,我在使用库存的Android下载管理器。
我尝试在Recycler View适配器上setOnClickListener
内的那个按钮上执行onBindViewHolder
,并在其中包含函数的内容:
holder.button.setOnClickListener {
val request = DownloadManager.Request(Uri.parse(downloadurl))
request.setTitle("$downloadname.apk")
request.setDescription("Download")
request.setVisibleInDownloadsUi(true)
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS)
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
val manager = getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
manager.enqueue(request)
}
但是在getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager
中,我说我需要一个Context
而不是一个String
。
然后,我尝试创建一个具有下载功能的对象,但是它给了我与该功能相同的错误。
如何使它在对象或setOnClickListener
中起作用?
答案 0 :(得分:1)
该错误消息是由于未传递预期的目标文件名引起的:
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
,您需要按照方法Context
的要求获取getSystemService()
的句柄:
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int position) {
final SomeClass item = getItem(position);
((ViewHolder) viewHolder).getDataBinding().buttonDownload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Context context = ((ViewHolder) viewHolder).mRecyclerView.getContext();
DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(item.getDownloadUrl()));
request.setTitle(item.getTitle());
request.setDescription(item.getDescription());
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, item.getFileName());
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setVisibleInDownloadsUi(true);
manager.enqueue(request);
}
});
}
随意将其自己从Java
转换为Kotlin
(在将代码粘贴到.kt
时会询问)。