最近在研究用优酷的SDK来进行视频上传的功能,由于优酷的SDK只是提供了一个上传的sample code,没有涉及到授权的过程,对于新手来说,可能非常棘手,现在分享一下我的思路:
 
程序实现前我们先要到优酷开放平台下载SDK(下载地址:http://open.youku.com/down
根据优酷SDK的说明,上传过程主要分为以下7个步骤:

1. 新建Android项目,引入YoukuUploadSDK-android jar包

2. 在MainActivity.Java文件添加代码如sample.java所示,添加相关参数

3. 文件夹layout下activity_main.xml添加控件

4. 生成代码(xml文件代码)

5. 连接android手机运行android项目生成apk(切记开启开发者选项usb调试等)

6. 授权过程(获取access_token)

7. 点击upload上传

其他的几步按照文档来做,应该不会有问题,下面重点说说步骤6的授权过程。

我们只能采用通用授权的方式(合作级别的授权方式需要收费),关于授权机制,请参考http://open.youku.com/docs/OAuth2.html

大概思路就是,通过一个WebView来显示授权页面获取授权码(code),我们需要使用http方法get的方式来获取授权码(code),所需的参数请参考http://open.youku.com/docs/OAuth2.html?id=101,然后通过使用授权码(code)来交换令牌即所谓的access_token,最后通过access_token来获取上传的权限。

代码如下看代码:

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.youku.uploader"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 用于读取手机当前的状态 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- SD卡读取权限,用户写入离线定位数据 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="sample.GetCodeActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="sample.MainActivity"
android:label="@string/app_name" >
</activity>
</application> </manifest>

GetCodeActivity.java

package sample;

import java.util.ArrayList;
import java.util.List; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast; import com.youku.uploader.R; public class GetCodeActivity extends Activity {
private WebView webview;
private String strCode;
private String access_token;
private String CLIENT_ID = "38bae68624af4531";
private String CLIENT_SECRET = "feb939fd882b449e1f022aa12fb9b06a";
private String TAG="GetCodeActivity";
private String REDIRECT_URL = "https://client.example.com/cb";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.request_code);
// 设置Web视图
webview =(WebView)findViewById(R.id.webView1);
if(webview == null){
return;
} //下面这个链接大家可只要把client_id及redirect_uri后面的值换成我们申请优酷开发者帐号时优酷提供的及我们设置的回调地址就可以
String url = "https://openapi.youku.com/v2/oauth2/authorize?client_id="+CLIENT_ID+"&response_type=code&redirect_uri="+REDIRECT_URL+"&state=xyz";
webview.loadUrl(url);
//https://api.weibo.com/oauth2/default.html
Log.d(TAG, "load before="+url);
webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
String[] str = null;
str = url.split("=")[1].split("&");
strCode = str[0];
Intent it = new Intent();
it.putExtra("code", strCode);
it.putExtra("access_token", getToken());
Log.d(TAG, "code="+strCode+ " status="+str[1]+" "+url +" token="+getToken()); // Toast.makeText(getApplicationContext(), strCode, 0).show();
it.setClass(GetCodeActivity.this, MainActivity.class);
startActivity(it);
return false;
}
});
}
private String getToken() {
// TODO Auto-generated method stub
Thread t = new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
String strUrl = "https://openapi.youku.com/v2/oauth2/token";
HttpResponse httpResponse = null;
HttpPost httpPost = new HttpPost(strUrl);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("client_id", CLIENT_ID));//你申请优酷的client_id
params.add(new BasicNameValuePair("client_secret", CLIENT_SECRET));//你申请优酷的client_secret
params.add(new BasicNameValuePair("grant_type", "authorization_code"));
params.add(new BasicNameValuePair("code", strCode));//刚刚获取到的code params.add(new BasicNameValuePair("redirect_uri", REDIRECT_URL));//回调地址,必须跟网站的一样
try {
httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
Log.d(TAG,"getToken () setEntity after"); httpResponse = new DefaultHttpClient().execute(httpPost);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
String result = EntityUtils.toString(httpResponse.getEntity());
Log.d(TAG,"result="+ result );
System.out.println(result);
JSONObject object = new JSONObject(result);
access_token = object.getString("access_token");//access_token获取成功 // Toast.makeText(getApplicationContext(), "access_token="+access_token, 0).show();
// return access_token;
}else{
Log.d(TAG,"getToken() getStatusCode="+ httpResponse.getStatusLine().getStatusCode());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.d(TAG,"Exception="+ e.toString());
}
}
});
t.start(); try {
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d(TAG, "access_token="+access_token);
return access_token;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
if(webview != null){
webview = null;
}
super.onDestroy();
} }

通过上述方法,我们可以很简单地获取优酷上传视频所需要的access_token,获取了access_token以后,我们就可以将access_token设置到params的参数中,这样我们就能实现上传视频到优酷了!如下:

MainActivity.java

package sample;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast; import com.youku.uploader.IUploadResponseHandler;
import com.youku.uploader.R;
import com.youku.uploader.YoukuUploader; public class MainActivity extends Activity implements OnClickListener { private ProgressBar progressBar; private TextView percent; private YoukuUploader uploader;
private String CLIENT_ID = "38bae68624af4531";
private String CLIENT_SECRET = "feb939fd882b449e1f022aa12fb9b06a";
private String code;
private String redirect_uri;
private String access_token;
private String TAG ="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent in = getIntent();
code = in.getStringExtra("code");
access_token = in.getStringExtra("access_token");
Log.d(TAG, "token ="+access_token);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
percent = (TextView) findViewById(R.id.percent); uploader = YoukuUploader.getInstance(CLIENT_ID, CLIENT_SECRET, getApplicationContext());
bindEvents(); } private void bindEvents() {
findViewById(R.id.upload).setOnClickListener(this);
findViewById(R.id.cancel).setOnClickListener(this);
} @Override
public void onClick(View v) { switch (v.getId()) { case R.id.upload: Thread tt = new Thread(new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
HashMap<String, String> params = new HashMap<String, String>();
params.put("username", "用户名");
params.put("password", "密码");
//这里需要将access_token设置到参数中
params.put("access_token",access_token);
Log.d(TAG, "access_token="+access_token);
HashMap<String, String> uploadInfo = new HashMap<String, String>();
uploadInfo.put("title", "小视频");
uploadInfo.put("tags", "原创");
// uploadInfo.put("file_name", "/mnt/sdcard2/download/dota2.mp4");
uploadInfo.put("file_name", Environment.getExternalStorageDirectory() + File.separator + "sharemv.mp4");
Log.d(TAG, "params="+params+ "uploadInfo "+uploadInfo+" file_name "+uploadInfo.get("file_name").toString());
uploader.upload(params, uploadInfo, new IUploadResponseHandler() { @Override
public void onStart() {
Log.v(TAG, "onStart");
progressBar.setProgress(0);
percent.setText("等待中");
} @Override
public void onSuccess(JSONObject response) {
Log.v(TAG, "onSuccess "+response.toString());
String respStr = response.toString().substring(13, response.toString().length()-2);
String str = String.format("http://v.youku.com/v_show/id_%s.html?from=y1.7-1.2", respStr); Log.v(TAG, "onSuccess "+" the uri is :" + str);
Toast.makeText(getApplicationContext(), "response.toString()", 0).show();
} @Override
public void onProgressUpdate(int counter) {
Log.v(TAG,"onProgressUpdate"+ counter + "");
progressBar.setProgress(counter);
percent.setText(counter + "%");
} @Override
public void onFailure(JSONObject errorResponse) {
Log.v(TAG,"onFailure"+ errorResponse.toString());
} @Override
public void onFinished() {
Log.v(TAG, "onFinished");
percent.setText("完成");
}
});
}
});
tt.start();
break; case R.id.cancel:
if (uploader.cancel()) {
progressBar.setProgress(0);
percent.setText("");
}
break;
}
} }

Android-调用优酷SDK上传视频的更多相关文章

  1. 【视频点播最佳实践】使用OSS SDK上传视频到点播

    摘要: 场景 点播上传SDK缺乏需要的语言版本(如C/C++.Go等)或相应的功能(如网络流上传.追加上传),可以直接使用OSS的SDK进行上传. 准备工作 确认已开通点播服务并完成了相关配置.确认已 ...

  2. thinkphp5.1调用七牛云SDK上传文件

    thinkphp5.0 class Upload { public static function image(){ if(empty($_FILES['file']['tmp_name'])){ e ...

  3. react-native绑定优酷SDK播放视频-附效果和git源码

    ReactNative绑定优酷SDK需要用到两部分知识: 优酷本身的sdk绑定: RN与原生界面的交互: 效果: RN版本:0.49.3 代码更新日期:2017.10.26 下文也根据绑定优酷需要的两 ...

  4. 动态获取爱奇艺上传视频mp4格式url地址

    有时候,在工作中有些客户需要用到视频,我们大家都知道视频是非常的耗费流量的,因此,如果因为项目要求客户单独买台视频服务器是非常划不来的.那么将视频上传到优酷,爱奇艺等视频网站来托管那是一件很好的解决方 ...

  5. Jquery Mobile实例--利用优酷JSON接口读取视频数据

    本文将介绍,如何利用JqueryMobile调用优酷API JSON接口显示视频数据. (1)注册用户接口. 首页,到 http://open.youku.com 注册一个账户,并通过验证.然后找到A ...

  6. android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果

    代码地址如下:http://www.demodashi.com/demo/13381.html 先来一波demo截图 实现ListView.GridView.瀑布流 1.导入RecyclerView的 ...

  7. 转:解决Onethink上传视频的问题 超棒的解决方案

    用过Onethink的都知道,它是不能上传视频的. 有人想到用上传附件的方式上传视频,但是结果……就是提示没有上传文件. 要是正常上传个一两兆的图片啊,压缩文件什么的还是可以的. 所以,重点来了 怎么 ...

  8. ASP.NET播客(留言时间,投票IP,留言限字数,上传视频)

    留言发布时间功能: 界面: 前台代码: 在Datalist控件中: 在<%#getIsDate(Convert.ToString(Eval("issuanceDate"))) ...

  9. ajax 异步上传视频带进度条并提取缩略图

    最近在做一个集富媒体功能于一身的项目.需要上传视频.这里我希望做成异步上传,并且有进度条,响应有状态码,视频连接,缩略图. 服务端响应 { "thumbnail": "/ ...

随机推荐

  1. 传智播客C++第五期培训视频教程免费下载

    C/C++的应用领域几乎无处不在,服务器,嵌入式,物联网,移动互联网,信息安全,游戏,基本上大小通吃.C/C++市场份额高达26%,也就是每四个程序员就有一个C/C++程序员.市场需求量非常大,而且工 ...

  2. html 元素 绝对位置坐标

    $(".seriesListings-itemContainer").click(function(){$(this).css("border","1 ...

  3. eclipse系列: Cannot change version of project facet Dynamic web的解决方法

    问题描述         用Eclipse创建Maven结构的web项目的时候选择了Artifact Id为maven-artchetype-webapp,由于这个catalog比较老,用的servl ...

  4. [CareerCup] 2.4 Partition List 划分链表

    2.4 Write code to partition a linked list around a value x, such that all nodes less than x come bef ...

  5. [CareerCup] 6.3 Water Jug 水罐问题

    6.3 You have a five-quart jug, a three-quart jug, and an unlimited supply of water (but no measuring ...

  6. LeetCode 笔记28 Maximum Gap

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  7. 第10章 系统级I/O

    第10章 系统级I/O 10.1 Unix I/O 一个Unix文件就是一个m个字节的序列:B0,B1,…,BK,…,Bm-1 Unix I/O:一种将设备优雅地映射为文件的方式,允许Unix内核引出 ...

  8. 做中学learning by doing——个人感想20155312张竞予

    做中学learning by doing--个人感想 概要 阅读五篇博客后的感触 我的个人技能 个人经验的类比与总结 c语言学习情况 java学习目标及规划 公文写作能力 我的感触 仔细阅读了老师公众 ...

  9. 文本模板转换工具包和 ASP.NET MVC

    http://msdn.microsoft.com/zh-sg/magazine/ee291528.aspx

  10. polya计数定理在ACM-icpc中的应用

    [数学公式] PG(x1,x2,...,xn) = 1/|G| * ∑π∈G x1^b1 * x2^b2*...*bn^bn   其中π是1^b12^b2...n^bn型轮换 然后一般染色情况下x1= ...