最近在研究用优酷的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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.youku.uploader"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6.  
  7. <uses-sdk
  8. android:minSdkVersion="11"
  9. android:targetSdkVersion="17" />
  10.  
  11. <uses-permission android:name="android.permission.INTERNET" />
  12. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  13. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  14. <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  15.  
  16. <!-- 这个权限用于进行网络定位 -->
  17. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  18. <!-- 这个权限用于访问GPS定位 -->
  19. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  20. <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
  21. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  22. <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
  23. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  24. <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
  25. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  26. <!-- 用于读取手机当前的状态 -->
  27. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  28. <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
  29. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  30. <!-- SD卡读取权限,用户写入离线定位数据 -->
  31. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  32.  
  33. <application
  34. android:allowBackup="true"
  35. android:icon="@drawable/ic_launcher"
  36. android:label="@string/app_name"
  37. android:theme="@style/AppTheme" >
  38. <activity
  39. android:name="sample.GetCodeActivity"
  40. android:label="@string/app_name" >
  41. <intent-filter>
  42. <action android:name="android.intent.action.MAIN" />
  43.  
  44. <category android:name="android.intent.category.LAUNCHER" />
  45. </intent-filter>
  46. </activity>
  47. <activity
  48. android:name="sample.MainActivity"
  49. android:label="@string/app_name" >
  50. </activity>
  51. </application>
  52.  
  53. </manifest>

GetCodeActivity.java

  1. package sample;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.apache.http.HttpResponse;
  7. import org.apache.http.NameValuePair;
  8. import org.apache.http.client.entity.UrlEncodedFormEntity;
  9. import org.apache.http.client.methods.HttpPost;
  10. import org.apache.http.impl.client.DefaultHttpClient;
  11. import org.apache.http.message.BasicNameValuePair;
  12. import org.apache.http.protocol.HTTP;
  13. import org.apache.http.util.EntityUtils;
  14. import org.json.JSONObject;
  15.  
  16. import android.app.Activity;
  17. import android.content.Intent;
  18. import android.os.Bundle;
  19. import android.util.Log;
  20. import android.webkit.WebView;
  21. import android.webkit.WebViewClient;
  22. import android.widget.Toast;
  23.  
  24. import com.youku.uploader.R;
  25.  
  26. public class GetCodeActivity extends Activity {
  27. private WebView webview;
  28. private String strCode;
  29. private String access_token;
  30. private String CLIENT_ID = "38bae68624af4531";
  31. private String CLIENT_SECRET = "feb939fd882b449e1f022aa12fb9b06a";
  32. private String TAG="GetCodeActivity";
  33. private String REDIRECT_URL = "https://client.example.com/cb";
  34. @Override
  35. protected void onCreate(Bundle savedInstanceState) {
  36. // TODO Auto-generated method stub
  37. super.onCreate(savedInstanceState);
  38. setContentView(R.layout.request_code);
  39. // 设置Web视图
  40. webview =(WebView)findViewById(R.id.webView1);
  41. if(webview == null){
  42. return;
  43. }
  44.  
  45. //下面这个链接大家可只要把client_id及redirect_uri后面的值换成我们申请优酷开发者帐号时优酷提供的及我们设置的回调地址就可以
  46. String url = "https://openapi.youku.com/v2/oauth2/authorize?client_id="+CLIENT_ID+"&response_type=code&redirect_uri="+REDIRECT_URL+"&state=xyz";
  47. webview.loadUrl(url);
  48. //https://api.weibo.com/oauth2/default.html
  49. Log.d(TAG, "load before="+url);
  50. webview.setWebViewClient(new WebViewClient() {
  51. @Override
  52. public boolean shouldOverrideUrlLoading(WebView view, String url) {
  53. // TODO Auto-generated method stub
  54. view.loadUrl(url);
  55. String[] str = null;
  56. str = url.split("=")[1].split("&");
  57. strCode = str[0];
  58. Intent it = new Intent();
  59. it.putExtra("code", strCode);
  60. it.putExtra("access_token", getToken());
  61. Log.d(TAG, "code="+strCode+ " status="+str[1]+" "+url +" token="+getToken());
  62.  
  63. // Toast.makeText(getApplicationContext(), strCode, 0).show();
  64. it.setClass(GetCodeActivity.this, MainActivity.class);
  65. startActivity(it);
  66. return false;
  67. }
  68. });
  69. }
  70. private String getToken() {
  71. // TODO Auto-generated method stub
  72. Thread t = new Thread(new Runnable() {
  73.  
  74. @Override
  75. public void run() {
  76. // TODO Auto-generated method stub
  77. String strUrl = "https://openapi.youku.com/v2/oauth2/token";
  78. HttpResponse httpResponse = null;
  79. HttpPost httpPost = new HttpPost(strUrl);
  80. List<NameValuePair> params = new ArrayList<NameValuePair>();
  81. params.add(new BasicNameValuePair("client_id", CLIENT_ID));//你申请优酷的client_id
  82. params.add(new BasicNameValuePair("client_secret", CLIENT_SECRET));//你申请优酷的client_secret
  83. params.add(new BasicNameValuePair("grant_type", "authorization_code"));
  84. params.add(new BasicNameValuePair("code", strCode));//刚刚获取到的code
  85.  
  86. params.add(new BasicNameValuePair("redirect_uri", REDIRECT_URL));//回调地址,必须跟网站的一样
  87. try {
  88. httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
  89. Log.d(TAG,"getToken () setEntity after");
  90.  
  91. httpResponse = new DefaultHttpClient().execute(httpPost);
  92. if (httpResponse.getStatusLine().getStatusCode() == 200) {
  93. String result = EntityUtils.toString(httpResponse.getEntity());
  94. Log.d(TAG,"result="+ result );
  95. System.out.println(result);
  96. JSONObject object = new JSONObject(result);
  97. access_token = object.getString("access_token");//access_token获取成功
  98.  
  99. // Toast.makeText(getApplicationContext(), "access_token="+access_token, 0).show();
  100. // return access_token;
  101. }else{
  102. Log.d(TAG,"getToken() getStatusCode="+ httpResponse.getStatusLine().getStatusCode());
  103. }
  104. } catch (Exception e) {
  105. // TODO Auto-generated catch block
  106. e.printStackTrace();
  107. Log.d(TAG,"Exception="+ e.toString());
  108. }
  109. }
  110. });
  111. t.start();
  112.  
  113. try {
  114. t.join();
  115. } catch (InterruptedException e) {
  116. // TODO Auto-generated catch block
  117. e.printStackTrace();
  118. }
  119. Log.d(TAG, "access_token="+access_token);
  120. return access_token;
  121. }
  122. @Override
  123. protected void onDestroy() {
  124. // TODO Auto-generated method stub
  125. if(webview != null){
  126. webview = null;
  127. }
  128. super.onDestroy();
  129. }
  130.  
  131. }

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

MainActivity.java

  1. package sample;
  2.  
  3. import java.io.File;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7.  
  8. import org.apache.http.HttpResponse;
  9. import org.apache.http.NameValuePair;
  10. import org.apache.http.client.entity.UrlEncodedFormEntity;
  11. import org.apache.http.client.methods.HttpPost;
  12. import org.apache.http.impl.client.DefaultHttpClient;
  13. import org.apache.http.message.BasicNameValuePair;
  14. import org.apache.http.protocol.HTTP;
  15. import org.apache.http.util.EntityUtils;
  16. import org.json.JSONObject;
  17.  
  18. import android.app.Activity;
  19. import android.content.Intent;
  20. import android.os.Bundle;
  21. import android.os.Environment;
  22. import android.util.Log;
  23. import android.view.View;
  24. import android.view.View.OnClickListener;
  25. import android.widget.ProgressBar;
  26. import android.widget.TextView;
  27. import android.widget.Toast;
  28.  
  29. import com.youku.uploader.IUploadResponseHandler;
  30. import com.youku.uploader.R;
  31. import com.youku.uploader.YoukuUploader;
  32.  
  33. public class MainActivity extends Activity implements OnClickListener {
  34.  
  35. private ProgressBar progressBar;
  36.  
  37. private TextView percent;
  38.  
  39. private YoukuUploader uploader;
  40. private String CLIENT_ID = "38bae68624af4531";
  41. private String CLIENT_SECRET = "feb939fd882b449e1f022aa12fb9b06a";
  42. private String code;
  43. private String redirect_uri;
  44. private String access_token;
  45. private String TAG ="MainActivity";
  46. @Override
  47. protected void onCreate(Bundle savedInstanceState) {
  48. super.onCreate(savedInstanceState);
  49. setContentView(R.layout.activity_main);
  50. Intent in = getIntent();
  51. code = in.getStringExtra("code");
  52. access_token = in.getStringExtra("access_token");
  53. Log.d(TAG, "token ="+access_token);
  54. progressBar = (ProgressBar) findViewById(R.id.progressbar);
  55. percent = (TextView) findViewById(R.id.percent);
  56.  
  57. uploader = YoukuUploader.getInstance(CLIENT_ID, CLIENT_SECRET, getApplicationContext());
  58. bindEvents();
  59.  
  60. }
  61.  
  62. private void bindEvents() {
  63. findViewById(R.id.upload).setOnClickListener(this);
  64. findViewById(R.id.cancel).setOnClickListener(this);
  65. }
  66.  
  67. @Override
  68. public void onClick(View v) {
  69.  
  70. switch (v.getId()) {
  71.  
  72. case R.id.upload:
  73.  
  74. Thread tt = new Thread(new Runnable() {
  75.  
  76. @Override
  77. public void run() {
  78. // TODO Auto-generated method stub
  79. HashMap<String, String> params = new HashMap<String, String>();
  80. params.put("username", "用户名");
  81. params.put("password", "密码");
  82. //这里需要将access_token设置到参数中
  83. params.put("access_token",access_token);
  84. Log.d(TAG, "access_token="+access_token);
  85. HashMap<String, String> uploadInfo = new HashMap<String, String>();
  86. uploadInfo.put("title", "小视频");
  87. uploadInfo.put("tags", "原创");
  88. // uploadInfo.put("file_name", "/mnt/sdcard2/download/dota2.mp4");
  89. uploadInfo.put("file_name", Environment.getExternalStorageDirectory() + File.separator + "sharemv.mp4");
  90. Log.d(TAG, "params="+params+ "uploadInfo "+uploadInfo+" file_name "+uploadInfo.get("file_name").toString());
  91. uploader.upload(params, uploadInfo, new IUploadResponseHandler() {
  92.  
  93. @Override
  94. public void onStart() {
  95. Log.v(TAG, "onStart");
  96. progressBar.setProgress(0);
  97. percent.setText("等待中");
  98. }
  99.  
  100. @Override
  101. public void onSuccess(JSONObject response) {
  102. Log.v(TAG, "onSuccess "+response.toString());
  103. String respStr = response.toString().substring(13, response.toString().length()-2);
  104. String str = String.format("http://v.youku.com/v_show/id_%s.html?from=y1.7-1.2", respStr);
  105.  
  106. Log.v(TAG, "onSuccess "+" the uri is :" + str);
  107. Toast.makeText(getApplicationContext(), "response.toString()", 0).show();
  108. }
  109.  
  110. @Override
  111. public void onProgressUpdate(int counter) {
  112. Log.v(TAG,"onProgressUpdate"+ counter + "");
  113. progressBar.setProgress(counter);
  114. percent.setText(counter + "%");
  115. }
  116.  
  117. @Override
  118. public void onFailure(JSONObject errorResponse) {
  119. Log.v(TAG,"onFailure"+ errorResponse.toString());
  120. }
  121.  
  122. @Override
  123. public void onFinished() {
  124. Log.v(TAG, "onFinished");
  125. percent.setText("完成");
  126. }
  127. });
  128. }
  129. });
  130. tt.start();
  131. break;
  132.  
  133. case R.id.cancel:
  134. if (uploader.cancel()) {
  135. progressBar.setProgress(0);
  136. percent.setText("");
  137. }
  138. break;
  139. }
  140. }
  141.  
  142. }

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. Android完美禁用Home键

    重写Activity的onAttachedToWindow 方法 @Override public void onAttachedToWindow() { System.out.println(&qu ...

  2. 用postgreSQL做基于地理位置的app(zz)

    前言:项目中用到了postgreSQL中的earthdistance()函数功能计算地球上两点之间的距离,中文的资料太少了,我找到了一篇英文的.讲的很好的文章,特此翻译,希望能够帮助到以后用到eart ...

  3. 发布HTML5 2D游戏引擎YEngine2D

    关于YEngine2D YEngine2D是一个开源的.采用HTML5技术和Javscript语言创建的2D游戏框架,用来构建web二维游戏. GitHub地址 最新版本 v0.1.2 浏览器支持 C ...

  4. unity3d 扩展NGUI —— 限制UI点击响应间隔

    当某个按钮按下后给服务器发送某条消息 如果玩家短时间内疯狂点击按钮很多次,这将会给服务器发送很多条无用数据 不但增加了服务器的压力,发送数据还浪费流量,甚至可能引发一些莫名其妙的bug 所以,限制UI ...

  5. 百度地图 IOS版开发经验分享

    最近刚完成app中地图的应用,感觉非常的曲折,折腾了很久,刚才开始一直不能成功使用百度地图api,报一大堆的错误,后来换到高德地图,又发现服务端使用的百度的经纬度,又从高德换回百度,泪奔. 这里简单比 ...

  6. C#中的yield return与Unity中的Coroutine(协程)(上)

    C#中的yield return C#语法中有个特别的关键字yield, 它是干什么用的呢? 来看看专业的解释: yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号.它的形式为下列之一 ...

  7. 一份完整的nginx配置

    #user nobody;worker_processes 24;worker_rlimit_nofile 262144;worker_cpu_affinity 0000000000000000000 ...

  8. Bootstrap3.0学习第二十五轮(JavaScript插件——折叠)

    详情请查看http://aehyok.com/Blog/Detail/31.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  9. MongoDB学习与BUG解答

    简单介绍: MongoDb也是NoSQL中的一种,并且是应用比较火的一门解决高效处理数据的技术. 网上说它是介于关系数据库 和非关系数据库之间的产品,它是非关系数据库中最丰富的,最像关系数据的. Q: ...

  10. iOS -- 给model赋值时走了[self setValuesForKeysWithDictionary:dic]不走setvalue: forked:

    这是一个小坑, 看看你的BaseModel的便利构造器的方法: + (__kindof BaseModel *)modelWithDic:(NSDictionary *)dic { return [[ ...