2

我正在使用YouTube Data API v3从我的 Android 应用程序将视频上​​传到我的 YouTube 帐户。上传过程完美。我需要的是,如果我的上传被中断(例如,因为 Internet 连接),我需要在下一次离开的地方开始上传。

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;
    }    
}

我怎样才能做到这一点?


使用 VideoUploadAsyncTask 类 doInBackground 方法进行更新

@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;
}
4

1 回答 1

2

你见过这个问题吗?

答案建议您应该使用;

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()));
  }
});

当你初始化你的 YouTube 对象时。

于 2014-01-06T10:36:22.980 回答