Как выполнить прямую загрузку из элементов RecyclerView (URL-адрес Firebase)?Не могу заставить это работать - PullRequest
0 голосов
/ 10 июня 2019

Я извлекаю некоторые файлы Firebase и перечисляю их с помощью RecyclerView. Я хочу загрузить один из этих файлов, когда нажимаю на кнопку загрузки в ListItem, не перенаправляя на URL, а непосредственно загружая.

Я пробовал разные способы для достижения этой цели, но все, кажется, просто не работает, я пробовал менеджер загрузок, AsyncTask, но любой из них либо не будет работать, либо вылетит из приложения, я ' Мы настроили разрешения Android в файле манифеста, так что проблема не в этом, это расстраивает, если кто-нибудь может мне помочь, потому что я застрял здесь. Ниже мой код

public class MaterialiAdapter extends RecyclerView .Adapter<MaterialiAdapter.MaterialiViewHolder>  {


Context context;
ArrayList<Upload> uploadMateriali;

public MaterialiAdapter(Context c, ArrayList<Upload> u){
    context=c;
    uploadMateriali=u;
}

@NonNull
@Override
public MaterialiViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
     return new MaterialiViewHolder(LayoutInflater.from(context).inflate(R.layout.recycler_materiali,parent,false));
 }

@Override
public void onBindViewHolder(@NonNull final MaterialiViewHolder materialiViewHolder, final int i) {
    materialiViewHolder.txtEmri.setText(uploadMateriali.get(i).getEmriMateriali());
    materialiViewHolder.txtUrl.setText(uploadMateriali.get(i).getDateMateriali());
   final String url=uploadMateriali.get(i).getUrlMateriali();
   final  String name=uploadMateriali.get(i).getEmriMateriali();
    materialiViewHolder.download.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startDownload(url,name);

        }
    });

}

private void startDownload(String url, String fileName) {
    Uri uri = Uri.parse(url);
    DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
    DownloadManager.Request request = new DownloadManager.Request(uri);
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);  // Tell on which network you want to download file.
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);  // This will show notification on top when downloading the file.
    request.setTitle("Downloading a file");
    request.setVisibleInDownloadsUi(true);
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);  // Storage directory path
    downloadManager.enqueue(request);

}


@Override
public int getItemCount() {
    return uploadMateriali.size();
}

class MaterialiViewHolder extends RecyclerView.ViewHolder {
    ImageView download;
    ImageView delete;
    TextView txtEmri;
    TextView txtUrl;

    public MaterialiViewHolder(@NonNull View itemView) {
        super(itemView);
        download = itemView.findViewById(R.id.imgDownMateriali);
        delete = itemView.findViewById(R.id.imgDelMateriali);
        txtEmri = itemView.findViewById(R.id.txtMaterialiName);
        txtUrl = itemView.findViewById(R.id.txtMaterialiDate);

    }
}


}

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

Logcat:

06-10 07:47:09.631 1119-1119/com.example.studentsapplication 
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.studentsapplication, PID: 1119
java.lang.NullPointerException: uriString
    at android.net.Uri$StringUri.<init>(Uri.java:470)
    at android.net.Uri$StringUri.<init>(Uri.java:460)
    at android.net.Uri.parse(Uri.java:432)
    at com.example.studentsapplication.MaterialiAdapter.startDownload(MaterialiAdapter.java:68)
    at com.example.studentsapplication.MaterialiAdapter.access$000(MaterialiAdapter.java:34)
    at com.example.studentsapplication.MaterialiAdapter$1.onClick(MaterialiAdapter.java:60)
    at android.view.View.performClick(View.java:4848)
    at android.view.View$PerformClick.run(View.java:20262)
    at android.os.Handler.handleCallback(Handler.java:815)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5631)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
  (ZygoteInit.java:959)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
...