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

    最近一直在研究 android ,并一边研究一边做应用.其中遇到了把程序通知常驻在 Notification 栏,并且不能被 clear 掉(就像android QQ一样)的问题.经过研究实现了其功能 ...

  2. BinaryWrite方法输出验证码

    在创建网站中验证码是不可或缺的.可以利用BinaryWrite输出二进制图像的方法输出验证码. 在开发图形验证码时,首先生成验证码,然后绘制成图像,最后通过该方法输出到页面中.所以熟练地掌握该方法可以 ...

  3. 微信小程序全面实战,架构设计 && 躲坑攻略(小程序入门捷径教程)

    最近集中开发了两款微信小程序,分别是好奇心日历(每天一条辞典+一个小投票)和好奇心日报(轻量版),直接上图: Paste_Image.png 本文将结合具体的实战经验,主要介绍微信小程序的基础知识.开 ...

  4. Orchard 刨析:导航篇

    之前承诺过针对Orchard Framework写一个系列.本应该在昨天写下这篇导航篇,不过昨天比较累偷懒的去玩了两盘单机游戏哈哈.下面进入正题. 写在前面 面向读者 之前和本文一再以Orchard ...

  5. EntityFramework_MVC4中EF5 新手入门教程之六 ---6.通过 Entity Framework 更新关联数据

    在前面的教程中,您将显示相关的数据 :在本教程中,您会更新相关的数据.对于大多数的关系,这个目标是可以通过更新相应的外键字段来达到的.对于多对多关系,实体框架并不直接,暴露联接表,因此您必须显式添加和 ...

  6. web前端开发教程系列-2 - 前端开发书籍分享

    目录: 前言 一. CSS 二. JavaScript 三. jQuery 四. 后记   前言 前端书籍在每个商城或书架上面都是琳琅满目,很多初学者又不能很好的判断书的质量或层次.因为今天给同学们分 ...

  7. 转:Oracle中merge into的使用

    最近项目上使用Oracle的Merge,所以找来一下资料学习了解. 该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和I ...

  8. Web前端开发Chrome插件

    参考:http://www.cnblogs.com/sosoft/p/3490481.html 越来越多的前端开发人员喜欢在Chrome里开发调试代码,Chrome有许多优秀的插件可以帮助前端开发人员 ...

  9. JavaScript、jQuery、AJAX、JSON 解释

  10. 读JS高级(兼容&&BOM&&私有变量&&面向对象)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...