Resumable YouTube uploads with YouTube Data API v3 in Android

1.4k views Asked by At

I'm uploading videos to my YouTube account from my Android application using YouTube Data API v3. Uploading process works perfectly. What I need is, if my upload got interrupted (eg. because of Internet connection) I need to start upload next time where it left.

private void uploadVideo(UploadInfo videoInfo) {

    Insert videoInsert = prepareUpload( new File(videoInfo.getFilePath()) );

    new VideoUploadAsyncTask(videoInfo, getActivity(), videoUploadAsyncTaskInterface).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, videoInsert);
}

public Insert prepareUpload( File videoFile ) {

    try {
        Video videoObjectDefiningMetadata = new Video();

        VideoStatus status = new VideoStatus();
        status.setPrivacyStatus("public");
        videoObjectDefiningMetadata.setStatus(status);

        VideoSnippet snippet = new VideoSnippet();

        snippet.setTitle(videoFile.getName());
        snippet.setDescription("Uploaded via AnujAroshA Android app");

        List<String> tags = new ArrayList<String>();
        tags.add("AnujAroshA");
        snippet.setTags(tags);

        videoObjectDefiningMetadata.setSnippet(snippet);

        InputStreamContent mediaContent = new InputStreamContent(VIDEO_FILE_FORMAT, new BufferedInputStream(new FileInputStream(videoFile)));
        mediaContent.setLength(videoFile.length());

        YouTube.Videos.Insert videoInsert = youtube.videos().insert("snippet,status", videoObjectDefiningMetadata, mediaContent);

        MediaHttpUploader uploader = videoInsert.getMediaHttpUploader();

        uploader.setDirectUploadEnabled(false);

        uploader.setChunkSize(MediaHttpUploader.MINIMUM_CHUNK_SIZE);

        return videoInsert;
    } catch (FileNotFoundException e) {
        return null;
    } catch (IOException e) {
        return null;
    }    
}

How can I do that?


Update with VideoUploadAsyncTask class doInBackground method

@Override
protected String doInBackground( Insert... inserts ) {

    try{

        Insert videoInsert = inserts[0];

        MediaHttpUploader uploader = videoInsert.getMediaHttpUploader();

        MediaHttpUploaderProgressListener progressListener = new MediaHttpUploaderProgressListener() {

            @Override
            public void progressChanged(MediaHttpUploader uploader) throws IOException {

                switch (uploader.getUploadState()) {
                case INITIATION_STARTED:
                    Log.d(TAG, "# INITIATION_STARTED ");
                    break;

                case INITIATION_COMPLETE:
                    Log.d(TAG, "# INITIATION_COMPLETE ");
                    break;

                case MEDIA_IN_PROGRESS:
                    int progress = (int) Math.round(uploader.getProgress() * 100);
                    Log.d(TAG, "# MEDIA_IN_PROGRESS : progress = " + progress + "%");

                    publishProgress(progress);
                    break;

                case MEDIA_COMPLETE:
                    Log.d(TAG, "# MEDIA_COMPLETE ");
                    publishProgress(100);
                    break;

                case NOT_STARTED:
                    Log.d(TAG, "# NOT_STARTED ");
                    break;

                default:
                    break;
                }
            }
        };

        uploader.setProgressListener(progressListener);

        Video returnedVideo = videoInsert.execute();

        return returnedVideo.getId();

    }catch(GooglePlayServicesAvailabilityIOException gpsaioe){

    }catch(UserRecoverableAuthIOException uraioe){

    }catch(GoogleAuthIOException gaioe){

    }catch(IOException ioe){

    }       
    return null;
}
1

There are 1 answers

0
Jon G On BEST ANSWER

Have you seen this question?

The answer suggests that you should use;

youtube = new YouTube.Builder(HTTP_TRANSPORT, JSON_FACTORY, new HttpRequestInitializer() {          
  @Override
  public void initialize(HttpRequest request) throws IOException {
    credential.initialize(request);
    request.setIOExceptionHandler(new HttpBackOffIOExceptionHandler(new ExponentialBackOff()));
  }
});

when you initialise your YouTube object.