Android 調用優酷SDK上傳視頻

來源:互聯網
上載者:User

標籤:優酷視頻上傳

最近在研究用優酷的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上傳視頻

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.