Android应用中的YouTube视频上传错误

时间:2012-05-05 10:25:54

标签: android youtube youtube-api

我需要在Android应用中将视频上传到Youtube。

我尝试通过HTTP Post方法上传视频..

首先,我获得了GoogleLogin身份验证的授权令牌。

然后我尝试使用HTTP Post请求上传视频。

以下是我的代码..

        HttpURLConnection conn = null;
        // BufferedReader br = null;
        DataOutputStream dos = null;
        InputStream inStream = null;

        // InputStream is = null;
        // OutputStream os = null;
        // boolean ret = false;
        // String StrMessage = "";
        String path = "/home/siva/test_data/";
        String existingFileName = "test5.3gp";
        File videoFile = new File(str);

        // String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "b93dcbA3";
        String ver = "2";

        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 2048;
        // String responseFromServer = "";
        try {
            FileInputStream fileInputStream = new FileInputStream(str);

            URL url = new URL(
                    "http://uploads.gdata.youtube.com/feeds/api/users/default/uploads");
            conn = (HttpURLConnection) url.openConnection();

            // Allow Inputs
            conn.setDoInput(true);
            // Allow Outputs
            conn.setDoOutput(true);
            // Don't use a cached copy.
            conn.setUseCaches(false);

            // Use a post method.
            conn.setRequestMethod("POST");
            // conn.setRequestProperty("Connection","Keep-Alive");
            conn.setRequestProperty("Host", "uploads.gdata.youtube.com");
            conn.setRequestProperty("Authorization", "GoogleLogin auth="
                    + token);
            conn.setRequestProperty("GData-Version", ver);
            conn.setRequestProperty("X-Gdata-Client", clientId);
            conn.setRequestProperty("X-GData-Key", "key=" + developerKey);
            conn.setRequestProperty("Slug", "VID_20120502_122127.3gp");
            conn.setRequestProperty("Content-Type",
                    "multipart/related;boundary=" + boundary);
            // conn.setRequestProperty("Content-Length", ""+videoFile.length());
            conn.setRequestProperty("Connection", "close");
            conn.setRequestProperty("Content-Type",
                    "application/atom+xml;charset=UTF-8");
            //conn.setRequestProperty("Content-Type", "video/*");
            conn.setRequestProperty("Content-Type", "video/3gpp");
            //conn.setRequestProperty("Content-Transfer-Encoding", "binary");
            conn.setRequestProperty("Content-Transfer-Encoding", "UTF-8");


            StringBuilder test_xml = new StringBuilder();
            test_xml.append("<?xml version='1.0'encoding='UTF-8'?>\n");
            test_xml.append("<entry xmlns=\"http://www.w3.org/2005/Atom\"\n");

            test_xml.append("xmlns:media=\"http://search.yahoo.com/mrss/\"\n");
            test_xml.append("xmlns:yt=\"http://gdata.youtube.com/schemas/2007\">\n");
            test_xml.append("<media:group>\n");
            test_xml.append("<media:title type=\"plain\">TestVideo</media:title>\n");
            test_xml.append("<media:descriptiontype=\"plain\">\nTest Video\n</media:description>\n");
            test_xml.append("<media:category\n");
            test_xml.append("scheme=\"http://gdata.youtube.com/schemas/2007/categories.cat\">People\n");
            test_xml.append("</media:category>\n");
            test_xml.append("<media:keywords>toast,wedding</media:keywords>\n");
            test_xml.append("</media:group>\n");
            test_xml.append("</entry>");

            String requestBody = new String(test_xml.toString().getBytes(),"UTF-8");
        int lngth = requestBody.length();
        conn.setRequestProperty("Content-Length", ""+lngth);

        dos = new DataOutputStream(conn.getOutputStream());
            dos.write((twoHyphens + boundary).toString().getBytes());
            dos.write(test_xml.toString().getBytes("UTF-8"));

            // System.out.println(test_xml.toString());
            dos.write((twoHyphens + boundary).toString().getBytes());

            // create a buffer of maximum size
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            // read file and write it into form
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            while (bytesRead > 0) {
                // dos.flush();
                dos.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            }


            dos.write((twoHyphens + boundary + twoHyphens).toString()
                    .getBytes());

            // close streams
            fileInputStream.close();
            dos.flush();
            dos.close();

        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

        StringBuilder outputBuilder = new StringBuilder();
        try {
            int responseCode = conn.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                inStream = conn.getInputStream();
            } else {
                inStream = conn.getErrorStream();
            }

            String string;
            if (inStream != null) {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(inStream));
                while (null != (string = reader.readLine())) {

                    outputBuilder.append(string).append("\n");
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (inStream != null) {
                try {
                    inStream.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

我收到如下错误。

05-05 15:43:18.391: W/System.err(2938): java.io.IOException: exceeded content-length limit of 476 bytes
05-05 15:43:18.391: W/System.err(2938):     at org.apache.harmony.luni.internal.net.www.protocol.http.RetryableOutputStream.write(RetryableOutputStream.java:58)
05-05 15:43:18.391: W/System.err(2938):     at java.io.DataOutputStream.write(DataOutputStream.java:99)
05-05 15:43:18.391: W/System.err(2938):     at java.io.FilterOutputStream.write(FilterOutputStream.java:105)
05-05 15:43:18.391: W/System.err(2938):     at com.VidoePick.VideoPickActivity.testvideo(VideoPickActivity.java:158)
05-05 15:43:18.391: W/System.err(2938):     at com.VidoePick.VideoPickActivity.onActivityResult(VideoPickActivity.java:73)
05-05 15:43:18.391: W/System.err(2938):     at android.app.Activity.dispatchActivityResult(Activity.java:3908)
05-05 15:43:18.391: W/System.err(2938):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)
05-05 15:43:18.391: W/System.err(2938):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574)
05-05 15:43:18.391: W/System.err(2938):     at android.app.ActivityThread.access$2000(ActivityThread.java:117)
05-05 15:43:18.391: W/System.err(2938):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
05-05 15:43:18.391: W/System.err(2938):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-05 15:43:18.391: W/System.err(2938):     at android.os.Looper.loop(Looper.java:130)
05-05 15:43:18.391: W/System.err(2938):     at android.app.ActivityThread.main(ActivityThread.java:3683)
05-05 15:43:18.391: W/System.err(2938):     at java.lang.reflect.Method.invokeNative(Native Method)
05-05 15:43:18.391: W/System.err(2938):     at java.lang.reflect.Method.invoke(Method.java:507)
05-05 15:43:18.391: W/System.err(2938):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-05 15:43:18.391: W/System.err(2938):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-05 15:43:18.391: W/System.err(2938):     at dalvik.system.NativeStart.main(Native Method)
05-05 15:43:18.401: W/System.err(2938): java.io.IOException: content-length promised 476 bytes, but received 10
05-05 15:43:18.401: W/System.err(2938):     at org.apache.harmony.luni.internal.net.www.protocol.http.RetryableOutputStream.close(RetryableOutputStream.java:48)
05-05 15:43:18.401: W/System.err(2938):     at org.apache.harmony.luni.internal.net.www.protocol.http.RetryableOutputStream.contentLength(RetryableOutputStream.java:64)
05-05 15:43:18.401: W/System.err(2938):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.prepareRequestHeaders(HttpURLConnectionImpl.java:864)
05-05 15:43:18.401: W/System.err(2938):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.writeRequestHeaders(HttpURLConnectionImpl.java:787)
05-05 15:43:18.401: W/System.err(2938):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1028)
05-05 15:43:18.401: W/System.err(2938):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726)
05-05 15:43:18.401: W/System.err(2938):     at com.VidoePick.VideoPickActivity.testvideo(VideoPickActivity.java:195)
05-05 15:43:18.401: W/System.err(2938):     at com.VidoePick.VideoPickActivity.onActivityResult(VideoPickActivity.java:73)
05-05 15:43:18.401: W/System.err(2938):     at android.app.Activity.dispatchActivityResult(Activity.java:3908)
05-05 15:43:18.401: W/System.err(2938):     at android.app.ActivityThread.deliverResults(ActivityThread.java:2528)
05-05 15:43:18.401: W/System.err(2938):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574)
05-05 15:43:18.401: W/System.err(2938):     at android.app.ActivityThread.access$2000(ActivityThread.java:117)
05-05 15:43:18.401: W/System.err(2938):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
05-05 15:43:18.401: W/System.err(2938):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-05 15:43:18.401: W/System.err(2938):     at android.os.Looper.loop(Looper.java:130)
05-05 15:43:18.401: W/System.err(2938):     at android.app.ActivityThread.main(ActivityThread.java:3683)
05-05 15:43:18.401: W/System.err(2938):     at java.lang.reflect.Method.invokeNative(Native Method)
05-05 15:43:18.401: W/System.err(2938):     at java.lang.reflect.Method.invoke(Method.java:507)
05-05 15:43:18.401: W/System.err(2938):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-05 15:43:18.401: W/System.err(2938):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-05 15:43:18.401: W/System.err(2938):     at dalvik.system.NativeStart.main(Native Method)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果您只想上传,则可以使用

<强>机器人-年初至今

一步一步完成教程

,请参阅此answer

答案 1 :(得分:0)

我有同样的错误。您需要在

中查看“Content-Length”属性
conn.setRequestProperty("Content-Length", "" + lngth);