Android 调用优酷SDK上传视频
来源:互联网 发布:数据备份与维护 编辑:程序博客网 时间:2024/06/02 07:31
最近在研究用优酷的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() {@Overridepublic void run() {// TODO Auto-generated method stubString 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 blocke.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";@Overrideprotected 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);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.upload:Thread tt = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubHashMap<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() {@Overridepublic void onStart() {Log.v(TAG, "onStart");progressBar.setProgress(0);percent.setText("等待中");}@Overridepublic 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();}@Overridepublic void onProgressUpdate(int counter) {Log.v(TAG,"onProgressUpdate"+ counter + "");progressBar.setProgress(counter);percent.setText(counter + "%");}@Overridepublic void onFailure(JSONObject errorResponse) {Log.v(TAG,"onFailure"+ errorResponse.toString());}@Overridepublic void onFinished() {Log.v(TAG, "onFinished");percent.setText("完成");}});}});tt.start();break;case R.id.cancel:if (uploader.cancel()) {progressBar.setProgress(0);percent.setText("");}break;}}}
0 0
- Android 调用优酷SDK上传视频
- Android调用优酷SDK实现上传视频到优酷
- Android 调用优酷SDK上传视频获取Token与code步骤
- android 视频直播SDK
- 优酷上传视频代码
- Unity3D调用Android SDK
- Android客户端调用优酷视频播放器…
- android调用百度音视频转码 MCT的SDK,BDCloudMediaPlayer初始化卡死的问题
- 调用优酷视频api
- Android 录制视频并上传
- iOS开发中集成阿里云视频上传SDK总结
- android视频录制(调用系统视频录制)
- 【高德地图Android SDK】视频教学
- 萤石云视频Android SDK接口使用说明
- 开源SDK实现Android视频直播
- Android/iOS视频编辑SDK开发记
- 实践手记——调用人人新版API2 SDK在android平台上发布新鲜事及上传照片
- 关于优酷开放SDK视频播放功能的解析
- codeforces #464C Substitutes in Number
- OCP-1Z0-051-2015-17题
- GRE词汇记忆备考常见误区
- CSS字体
- Linux中grep
- Android 调用优酷SDK上传视频
- 排序算法系列之快排
- MDK配置jlink仿真器步骤
- Java GUI程序设计的初步上
- emWin+touch移植到STM32战舰开发板
- OCP-1Z0-051-2015-18题
- hibernate 多对一,一对多
- Git提交本地库代码到远程服务器的操作
- Linux内核中内存相关的操作函数-2