標籤:優酷視頻上傳
最近在研究用優酷的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", "15718854035");params.put("password", "243979");//這裡需要將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;}}}
Android 調用優酷SDK上傳視頻