Home > Back-end >  Attempt to invoke virtual method 'java.lang.String at.huber.youtubeExtractor.YtFile.getUrl()�
Attempt to invoke virtual method 'java.lang.String at.huber.youtubeExtractor.YtFile.getUrl()�

Time:11-19

In the first install application in my physic device. I am able to download some videos to storage but when I do the same with some more videos it cannot. Then Android Studio IDE announce to me error in line init String downloadURL like title of this question. This is my code:

String youtubeLink = ("https://www.youtube.com/watch?v="   videoYT.getId().getVideoId());
                    YouTubeUriExtractor ytEx = new YouTubeUriExtractor(context) {
                        @Override
                        public void onUrisAvailable(String videoId, String videoTitle, SparseArray<YtFile> ytFiles) {
                            if (ytFiles != null) {
                                int itag = 22;
                                String downloadURL = ytFiles.get(itag).getUrl();// line where Android Studio IDE gives an error
                                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadURL));
                                String title = URLUtil.guessFileName(downloadURL,null,null);
                                request.setTitle(title);
                                request.setDescription("Downloading file...");
                                String cookie = CookieManager.getInstance().getCookie(downloadURL);
                                request.addRequestHeader("cookie",cookie);
                                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,title);
                                DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                                downloadManager.enqueue(request);
                                Toast.makeText(context, "Bắt đầu tải xuống...", Toast.LENGTH_SHORT).show();
                            }
                        }
                    };
                    ytEx.execute(youtubeLink);

CodePudding user response:

The problem is here ytFiles.get(itag).

In the source code of SparseArray: get() will return null

     /**
      * Gets the Object mapped from the specified key, or <code>null</code>
      * if no such mapping has been made.
      */
     public E get(int key) {
         return get(key, null);
     }

If you use kotlin to implement, you need to modify it to:

val downloadURL = ytFiles.get(itag)?.getUrl() ?: ""

To achieve this with Java, you need to perform a null operation on the ytFiles.get(itag) object.

  • Related