Leo仿【DOTA视频站】项目实践【四】---- 授权获取优酷access_token
2015-09-01 09:23
627 查看
由于在应用中涉及到评论、获取用户信息等,故需要获取授权信息access_token。当时主要纠结的是OAuth回调地址的设置怎么弄。因为我的应用只有手机端嘛,没有一个页面。可是在看到一个博客之后,将回调地址设置为 https://client.example.com/cb ,测试之后果真获取成功。
点击打开链接
以下是转载内容:
最近在研究用优酷的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
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
点击打开链接
以下是转载内容:
最近在研究用优酷的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> </activit 4000 y> <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", "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() { @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; } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories