做了个Android项目,需要接入新浪微博,实现时也顺带着研究了下腾讯微博和人人网的Android客户端接入,本文就跟大家分享下三者的Android客户端接入方法。

一、实例概述

说白了,接入微博就是让你的应用程序可以调用新浪微博,腾讯微博和人人网的api,实现微博发送,分享给好友等等的功能啦。当然也可以实现让你的客户端使用微博账号进行登录。我们这篇文章要讲的就是访问这些社交平台提供的api的时候比较关键的一步,获取调用api接口的token,token可以理解为我们的客户端程序与社交平台api交互的令牌。

二、官方教程

学习东西,当然是官方的东西最好了。下面我们就简单说说接入新浪,腾讯微博以及人人网的官方教程吧。同学们也可以自行去看官方的教程,那么我下面写的东西就可以忽略不计了。

新浪微博 api:http://open.weibo.com/wiki/%E9%A6%96%E9%A1%B5

首先,当然你得有一个新浪微博的账号啦。然后就是注册应用啊等等一代堆东西,自己去 开发指南--新手引导 中看吧。然后,就要填写我们的信息了。这里要注意授权页的填写,在 我的应用--应用信息--高级信息--授权回调页 这里,如下图1。最后,就是如何对我们的客户端程序进行授权了。新浪微博的授权机制说明如下:大部分API的访问如发表微博、获取私信,关注都需要用户身份。目前新浪微博开放平台用户身份鉴权有OAuth2.0和Basic Auth(仅用于应用所属开发者调试接口)两种方式。我们这里采用的是OAuth2.0的授权机制。

如何获取token,我们将在下面的文章中结合代码进行讲解。

图1 设置授权回调页

腾讯微博  api:http://dev.t.qq.com/

腾讯微博的应用申请和新浪微博的类似,它也有一个授权回调页。不过它不是这个名字,它的名字是:应用网址。为简单起见,我们这里也使用默认的地址,即:http://www.tencent.com/zh-cn/index.shtml 其他的和腾讯微博差不多,就不赘述了。腾讯微博提供了OAuth 1.0a,OAuth2.0和OpenId&OpenKey授权方式,本人中采用的是OAuth2.0授权方式,其他的方式同学们自行研究。

      人人网  api:http://dev.renren.com/    人人网使用OAuth 2.0作为验证与授权协议。

人人网目前有一个移动开发者平台,专门为移动应用和HTML5应用提供更简洁的授权接口,简单易用,称为人人移动开发者中心。地址如下:

http://dev.mobile.renren.com/home/show

     三、关于OAuth2.0

本人比较懒,就不把概念贴在这里了。自己百度去吧,百度百科中有这样的一句概括:OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程。这里我们稍微说一下OAuth2.0的认证流程。

在OAuth2.0的处理流程,主要分为以下四个步骤:

1、得到授权码code

2、获取access token

3、通过access token,获取OpenID

4、通过access token及OpenID调用API,获取用户授权信息

上面是流程的大概四个步骤,在下面的流程示意图中会得到体现,这是我制作的一个幻灯片的流程图(文章最后会附上制作的OAuth幻灯片分享给大家),这里就直接截图下来进行讲解:

图2 OAuth2.0 认证流程

第一步:首先直接跳转至用户授权地址,即图示 Request User Url ,提示用户进行登录,并给予相关资源授权,得到唯一的Auth code,这里注意的是code只有10分钟的有效期,对于安全考虑,相对于OAuth1.0省了一步获取临时的Token,并且有效期也进行了控制,比1.0认证简化了很多,并安全一些;

第二步:得到授权code后,这一步就是请求access token,通过 图示 Request access url ,生成得到数据Token;

第三步:通过Access Token请求OpenID,openid是用户在此平台的唯一标识,通过 图示 Request info url 请求,然后得到OpenID;

第四步:通过第二步得到的数据Token、第三步得到的OpenID及相关API,进行请求,获取用户授权资源信息。(我喜欢简洁明了,OAuth2.0认证流程就是这样,相信通过图示及讲解都能明白,若有不明白之处请留言)

四、让你的应用程序访问社交平台api(获取token)

注意要加相应的权限,文章后面会贴出清单文件中所需的权限。

 新浪微博授权:

详细内容请参见新浪微博SDK中自带的文档:Android平台微博SDK说明文档.docx。它在SDK的工程目录下,所以你要导入SDK工程的时候主要把它去了。由于新浪微博给我们提供的SDK是以工程的方式给出的,所以我们需要引用它的工程才可以使用它提供的api。当然啦,这样放到实际环境中是不行的。所以我们可以将SDK下的相关文件拷贝到我们的自己的工程目录下即可,注意修改相应的东西。本人是这样做的,不知道还有没有更好的方式。具体的请看文章后面给出的demo。值得一提的是,人人网也是以这种方式提供SDK的,但是腾讯微博给我们提供的是JAR,这个看起来就简洁多了。这里顺便说一下覆盖的方法吧,就是将新浪微博给我们提供的SDK工程文件下的src和res文件夹拷贝到你自己的工程中覆盖原有的文件即可。

环境准备好了,我们就可以开始进行代码的编写了。还是那句话,有官方教程在呢,同学们可以对着教程来练习,我下面只是结合代码简单的说一下。

Java代码
  1. //sina   CONSUMER_KEY、CONSUMER_SECRET替换成你自己应用的key和secret
  2. private static final String CONSUMER_KEY = "913917729";
  3. private static final String CONSUMER_SECRET = "32c47f37e4727ce9c0db1ceee12bf765";
  4. private String redirectUriSina="http://www.sina.com"; //授权回调页    与 我的应用--应用信息--高级信息 中一致
  5. OAuthV2 authV2 = null;//腾讯微博Oauth
  6. Renren renren = null;//renren
  7. File file = null;
  8. String basepath = "";
  9. //tencent CLINETID、CLIENTSECRET替换成你自己应用的key和secret
  10. private static final String CLINETID = "801208558";
  11. private static final String CLIENTSECRET = "da6d09bb537559c37cb36561fd825346";
  12. //认证成功后浏览器会被重定向到这个url中  必须与注册时填写的一致
  13. private String redirectUriTen="http://www.tencent.com/zh-cn/index.shtml";
  14. //renren API_KEY、SECRET_KEY替换成你自己应用的key和secret
  15. private static final String API_KEY = "b6f9602ab3714023b794d34b51639a99";
  16. private static final String SECRET_KEY = "f51ce08118014784a0579ba88730b6bd";
  17. private static final String APP_ID = "206681";//人人网还需要app_id
  18. private static final int RENREN_REQUEST_CODE = 123;
  19. String accessToken;
Java代码
  1. //新浪微博认证
  2. Weibo weibo = Weibo.getInstance();
  3. if(!isOauthSina(weibo)){
  4. weibo.setupConsumerConfig(CONSUMER_KEY, CONSUMER_SECRET);//设置你的key和secret
  5. weibo.setRedirectUrl(redirectUriSina);
  6. weibo.authorize(this, new OauthDialogListener());
  7. }else{
  8. tv.setText("access_token : " + accessToken);
  9. Toast.makeText(getApplicationContext(), "该用户已经授权", Toast.LENGTH_SHORT).show();
  10. Intent intent = new Intent();
  11. intent.putExtra("accessToken", accessToken);
  12. intent.putExtra("flag", MyContent.SINA);
  13. intent.setClass(InsertWeiboActivity.this, TestActivity.class);
  14. startActivity(intent);
  15. }

isOauthSina方法如下,它的作用是判断用户是否已经对我们的应用进行了授权。

Java代码
  1. /**
  2. * 新浪微博 用户是否已经授权
  3. * @param weibo
  4. * @return
  5. */
  6. private boolean isOauthSina(Weibo weibo){
  7. boolean b = false;
  8. accessToken = getSharedPreferences("token", Context.MODE_PRIVATE).getString("access_token", "");
  9. if(weibo != null && !accessToken.equals("")){
  10. b = true;
  11. }
  12. return b;
  13. }

上面的两段代码中, 值得注意的地方是redirectUriSina,它是一个String类型的参数,值就是我们在之前提到过得那个授权回调页的地址。接着新浪微博将弹出一个授权页面的对话框,供用户输入用户名和密码(此处就不截图了)。在用户输入用户名和密码之后,它将被我们的OauthDialogListener类监听到,它的实现如下:

Java代码
  1. /**
  2. * 弹出新浪微博的授权页面
  3. * @author yanbin
  4. *
  5. */
  6. private class OauthDialogListener implements WeiboDialogListener{
  7. @Override
  8. public void onComplete(Bundle values) {
  9. String token = values.getString("access_token");
  10. String expires_in = values.getString("expires_in");
  11. tv.setText("access_token : " + token + "  expires_in: "
  12. + expires_in);
  13. AccessToken accessToken = new AccessToken(token, CONSUMER_SECRET);
  14. SharedPreferences sf = getSharedPreferences("token", Context.MODE_PRIVATE);
  15. sf.edit().putString("access_token", accessToken != null ? accessToken.getToken() : "")
  16. .commit();
  17. //          accessToken.setExpiresIn(expires_in);
  18. //          Weibo.getInstance().setAccessToken(accessToken);
  19. Intent intent = new Intent();
  20. intent.putExtra("accessToken",accessToken.getToken());
  21. intent.putExtra("flag", MyContent.SINA);
  22. intent.setClass(InsertWeiboActivity.this, TestActivity.class);
  23. startActivity(intent);
  24. }
  25. @Override
  26. public void onWeiboException(WeiboException e) {
  27. //未作处理
  28. }
  29. @Override
  30. public void onError(DialogError e) {
  31. //未作处理
  32. }
  33. @Override
  34. public void onCancel() {
  35. Toast.makeText(InsertWeiboActivity.this, "您已经取消授权", 1).show();
  36. }
  37. }

WeiboDialogListener中有一个回调方法,它会在用户输入正确的用户名和密码之后返回给我们的客户端程序获取新浪微博提供的api的令牌(这个东西很重要的,你调用新浪微博api的时候每次都必须把它带上)。接下来的工作就是保存此token供下次使用了。这里我们存储在SharedPreference中。至此,我们就获取了新浪微博的token,接下来就可以操作新浪微博api了,比如发布一条微博,可以试试哦。

腾讯微博授权: 

腾讯微博授权的官方实例请看这里,http://wiki.open.t.qq.com/index.php/%E7%A7%BB%E5%8A%A8%E5%BA%94%E7%94%A8%E6%8E%A5%E5%85%A5/Android_SDK_V1.2。下面我们结合代码说说我们的实现。  首先第一步就是得到腾讯给我们提供的授权回调页,代码如下,由于要弹出OAuthV2AuthorizeWebView这个页面,所以要在清单文件中声明。

Java代码
  1. //判断用户是否已经授权
  2. if(!isOauchTen()){
  3. //使用回调url来创建授权页面
  4. authV2 = new OAuthV2(redirectUriTen);
  5. authV2.setClientId(CLINETID);
  6. authV2.setClientSecret(CLIENTSECRET);
  7. //关闭OAuthV2Client中的默认开启的QHttpClient。
  8. OAuthV2Client.getQHttpClient().shutdownConnection();
  9. Intent intent = new Intent(InsertWeiboActivity.this, OAuthV2AuthorizeWebView.class);//创建Intent,使用WebView让用户授权
  10. intent.putExtra("oauth", authV2);
  11. startActivityForResult(intent,2);
  12. }else{
  13. Toast.makeText(getApplicationContext(), "该用户已经授权", Toast.LENGTH_SHORT).show();
  14. Intent intent = new Intent();
  15. intent.putExtra("oauth", authV2);
  16. intent.putExtra("flag", MyContent.TENCENT);
  17. intent.setClass(InsertWeiboActivity.this, TestActivity.class);
  18. startActivity(intent);
  19. }

这里我们看到了startActivityForResult,它会在用户输入完用户名和密码后执行OnActivityResult方法(包括了人人的实现),isOauthTen()方法的作用是判断用户是否已经授权过该应用。它们的代码如下:

OnActivityResult()方法:

Java代码
  1. /**
  2. * 新浪微博和人人网的授权
  3. * 通过读取OAuthV2AuthorizeWebView返回的Intent,获取用户授权信息
  4. */
  5. @Override
  6. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  7. if (requestCode==2) {
  8. //腾讯微博授权
  9. if (resultCode==OAuthV2AuthorizeWebView.RESULT_CODE)    {
  10. OAuthV2 oAuth=(OAuthV2) data.getExtras().getSerializable("oauth");
  11. if(oAuth != null && oAuth.getStatus()==0){
  12. Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
  13. //跳转到发微博的界面
  14. Intent intent = new Intent();
  15. intent.putExtra("accessToken", oAuth.getAccessToken());
  16. intent.putExtra("oauth", oAuth);
  17. intent.putExtra("flag", MyContent.TENCENT);
  18. //将认证保存起来,使用对象流
  19. FileOutputStream fos = null;
  20. ObjectOutputStream oos = null;
  21. try {
  22. fos = new FileOutputStream(file);
  23. oos = new ObjectOutputStream(fos);
  24. oos.writeObject(oAuth);
  25. } catch (FileNotFoundException e) {
  26. e.printStackTrace();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. } finally{
  30. if(oos != null){
  31. try {
  32. oos.close();
  33. oos = null;
  34. } catch (IOException e) {
  35. e.printStackTrace();
  36. }
  37. if(fos != null){
  38. try {
  39. fos.close();
  40. fos = null;
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }
  46. }
  47. intent.setClass(InsertWeiboActivity.this, TestActivity.class);
  48. startActivity(intent);
  49. }
  50. else
  51. Toast.makeText(getApplicationContext(), "登陆失败", Toast.LENGTH_SHORT).show();
  52. }else{
  53. Toast.makeText(getApplicationContext(), "授权失败", Toast.LENGTH_SHORT).show();
  54. }
  55. }else if(requestCode == RENREN_REQUEST_CODE){
  56. //人人网授权
  57. if (renren != null) {
  58. renren.authorizeCallback(requestCode, resultCode, data);
  59. }else{
  60. Toast.makeText(getApplicationContext(), "授权失败", Toast.LENGTH_SHORT).show();
  61. }
  62. }
  63. }

isOauchTen()方法:

Java代码
  1. /**
  2. * 腾讯微博接入是否已经验证
  3. * @return
  4. */
  5. private boolean isOauchTen() {
  6. boolean b = false;
  7. FileInputStream fis = null;
  8. ObjectInputStream ois = null;
  9. try {
  10. openFileOutput("aaa", Context.MODE_PRIVATE);
  11. persistTenOauth();
  12. fis = new FileInputStream(file);
  13. ois = new ObjectInputStream(fis);//此处抛出EOFException,原因是独到了流的末尾还是返回空,我们这里直接在异常中将标志位记为false即可。
  14. authV2 = (OAuthV2) ois.readObject();
  15. if(authV2 != null){
  16. b = true;
  17. }
  18. } catch (Exception e) {
  19. b = false;
  20. } finally{
  21. if(ois != null){
  22. try {
  23. ois.close();
  24. ois = null;
  25. } catch (Exception e2) {
  26. e2.printStackTrace();
  27. }
  28. }
  29. if(fis != null){
  30. try {
  31. fis.close();
  32. fis = null;
  33. } catch (Exception e2) {
  34. e2.printStackTrace();
  35. }
  36. }
  37. }
  38. return b;
  39. }

persistTenOauth()方法的作用是将我们获取到的token存储起来,由于调用腾讯微博api需要Token对象,没有办法所以我们只有将Token对象存起来,这里使用对象流的方式,具体实现如下:

Java代码
  1. /**
  2. * 将腾讯微博的oauth持久化到文件中
  3. */
  4. private void persistTenOauth(){
  5. //加这一句的作用是防止  /data/data/package-name这个目录不存在
  6. String s = getFileStreamPath("aaa").getAbsolutePath();
  7. for(String ss : fileList()){
  8. System.out.println("ss==" + ss);
  9. }
  10. String x = "";
  11. try{
  12. x = s.substring(0,s.lastIndexOf("/"));
  13. }catch(Exception e){
  14. e.printStackTrace();
  15. x = "/data/data/yanbin.insertweibo";
  16. }
  17. //将文件存放在 /data/data/package-name目录下,当然你也可以存储在别的地方
  18. try {
  19. file = new File(x + "/oauth_ten.data");
  20. if(!file.exists()){
  21. new File(x).mkdirs();
  22. file.createNewFile();
  23. }
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }

至此,我们已经成功的获取到了访问腾讯微博必须的令牌,接下来我们就可以使用这个令牌操纵api了。

人人网授权:

人人网并没有实现发心情的功能,只是简单的获取了它的token。

实现的代码如下:

Java代码
  1. if(!isOauthRenren()){
  2. renren = new Renren(API_KEY, SECRET_KEY, APP_ID, this);
  3. renren.authorize(this, null, new MyRenrenListener(), RENREN_REQUEST_CODE);
  4. }else{
  5. Toast.makeText(getApplicationContext(), "该用户已经授权", Toast.LENGTH_SHORT).show();
  6. }

isOauthRenren用来判断用户是否对本客户端进行了授权。MyRenrenListener类会在用户在输入框中输入用户名和密码后回调。它们的具体实现如下:

isOauthRenren()方法:

Java代码
  1. /**
  2. * renren 判断用户是否已经授权
  3. * @return
  4. */
  5. private boolean isOauthRenren(){
  6. boolean b = false;
  7. String token = getSharedPreferences("oauth_renren", Context.MODE_PRIVATE).getString("access_token", "");
  8. if(!"".equals(token)){
  9. b = true;
  10. }
  11. return b;
  12. }

MyRenrenListener类的实现:

Java代码
  1. /**
  2. * 人人请求用户授权返回界面
  3. * @author yanbin
  4. *
  5. */
  6. private class MyRenrenListener implements RenrenAuthListener{
  7. @Override
  8. public void onComplete(Bundle values) {
  9. //服务器端返回的数据
  10. //          {
  11. //          "access_token": "10000|5.a6b7dbd428f731035f771b8d15063f61.86400.1292922000-222209506",
  12. //          "expires_in": 87063,
  13. //          "refresh_token": "10000|0.385d55f8615fdfd9edb7c4b5ebdc3e39-222209506",
  14. //          "scope": "read_user_album read_user_feed"
  15. //          }
  16. Bundle bundle = values;
  17. String access_token = bundle.getString("access_token");
  18. int expires_in = bundle.getInt("expires_in");
  19. String refresh_token = bundle.getString("refresh_token");
  20. String scope = bundle.getString("scope");
  21. System.out.println("验证服务器端返回的数据-->" + "access_token-->" + access_token
  22. + ",expires_in-->" + expires_in
  23. + ",refresh_token-->" + refresh_token
  24. + ",scope-->" + scope);
  25. SharedPreferences sp = getSharedPreferences("oauth_renren", Context.MODE_PRIVATE);
  26. sp.edit().putString("access_token", access_token).commit();
  27. Toast.makeText(getApplicationContext(), "用户授权成功", Toast.LENGTH_SHORT).show();
  28. //结果:
  29. //验证服务器端返回的数据-->access_token-->206681|6.725b8c8b3457a7d2953868d63aaf4486.2592000.1346828400-473945629
  30. //,expires_in-->0,refresh_token-->null,
  31. //scope-->publish_feed create_album photo_upload read_user_album status_update
  32. }
  33. @Override
  34. public void onRenrenAuthError(RenrenAuthError renrenAuthError) {
  35. Toast.makeText(getApplicationContext(), "异常", Toast.LENGTH_SHORT).show();
  36. }
  37. @Override
  38. public void onCancelLogin() {
  39. //未作处理
  40. }
  41. @Override
  42. public void onCancelAuth(Bundle values) {
  43. //未作处理
  44. }
  45. }

至此,我们也成功的获取到了访问人人网api的token,接下来就是对api的操作了。下面是一些相关的类(TestActivity.java)和AndroidManifest.xml文件。

TestActivity.java:

Java代码
  1. package yanbin.insertWeibo;
  2. import java.net.InetAddress;
  3. import java.net.NetworkInterface;
  4. import java.net.SocketException;
  5. import java.util.Enumeration;
  6. import com.tencent.weibo.api.TAPI;
  7. import com.tencent.weibo.constants.OAuthConstants;
  8. import com.tencent.weibo.oauthv2.OAuthV2;
  9. import com.weibo.net.Utility;
  10. import com.weibo.net.Weibo;
  11. import com.weibo.net.WeiboException;
  12. import com.weibo.net.WeiboParameters;
  13. import android.app.Activity;
  14. import android.os.Bundle;
  15. import android.view.View;
  16. import android.widget.Button;
  17. import android.widget.EditText;
  18. import android.widget.Toast;
  19. /**
  20. * 腾讯微博,新浪微博   简单的发送一条微博,可以进你自己的微博查看是否发送成功
  21. * @author yanbin
  22. */
  23. public class TestActivity extends Activity {
  24. Button btnSend ;
  25. EditText et;
  26. String accessToken;
  27. OAuthV2 oAuthV2,oAuthV2_2;
  28. int flag ;//flag用来标记是来自新浪,腾讯微博还是人人
  29. @Override
  30. protected void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.send_weibo);
  33. accessToken = getIntent().getStringExtra("accessToken");
  34. flag = getIntent().getIntExtra("flag", -1);
  35. oAuthV2 =  (OAuthV2) getIntent().getSerializableExtra("oauth");
  36. btnSend = (Button) findViewById(R.id.btnSend);
  37. et = (EditText) findViewById(R.id.et);
  38. }
  39. public void click(View view){
  40. int id = view.getId();
  41. switch (id) {
  42. case R.id.btnSend:
  43. switch (flag) {
  44. case MyContent.SINA:
  45. Weibo weibo = Weibo.getInstance();
  46. WeiboParameters parameters = new WeiboParameters();
  47. parameters.add("access_token", accessToken);
  48. parameters.add("status", et.getText().toString());
  49. //发送一条微博 url https://api.weibo.com/2/statuses/update.json
  50. try {
  51. String flag = weibo.request(this, Weibo.SERVER + "statuses/update.json", parameters, Utility.HTTPMETHOD_POST, weibo.getAccessToken());
  52. System.out.println("flag==" + flag);
  53. Toast.makeText(this, "发送微博成功", 1).show();
  54. } catch (WeiboException e) {
  55. e.printStackTrace();
  56. Toast.makeText(this, "发送微博失败", 1).show();
  57. }
  58. finish();
  59. break;
  60. case MyContent.TENCENT:
  61. TAPI tapi = new TAPI(OAuthConstants.OAUTH_VERSION_2_A);
  62. try {
  63. String response=tapi.add(oAuthV2, "json", et.getText().toString(), getHostIp());
  64. System.out.println("response==" + response);
  65. tapi.shutdownConnection();
  66. System.out.println("发送微博成功");
  67. Toast.makeText(this, "发送微博成功", 1).show();
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. Toast.makeText(this, "发送微博失败", 1).show();
  71. }
  72. finish();
  73. break;
  74. }
  75. break;
  76. }
  77. }
  78. /**
  79. * 获取用户ip
  80. * @return
  81. */
  82. public static String getHostIp() {
  83. try {
  84. for (Enumeration<NetworkInterface> en = NetworkInterface
  85. .getNetworkInterfaces(); en.hasMoreElements();) {
  86. NetworkInterface intf = en.nextElement();
  87. for (Enumeration<InetAddress> ipAddr = intf.getInetAddresses(); ipAddr
  88. .hasMoreElements();) {
  89. InetAddress inetAddress = ipAddr.nextElement();
  90. if (!inetAddress.isLoopbackAddress()) {
  91. return inetAddress.getHostAddress();
  92. }
  93. }
  94. }
  95. } catch (SocketException ex) {
  96. } catch (Exception e) {
  97. }
  98. return null;
  99. }
  100. }

AndroidManifest.xml:

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="yanbin.insertWeibo"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk android:minSdkVersion="7" />
  7. <application
  8. android:icon="@drawable/ic_launcher"
  9. android:label="@string/app_name" >
  10. <activity
  11. android:name=".InsertWeiboActivity"
  12. android:label="@string/app_name" >
  13. <intent-filter>
  14. <action android:name="android.intent.action.MAIN" />
  15. <category android:name="android.intent.category.LAUNCHER" />
  16. </intent-filter>
  17. </activity>
  18. <activity android:name=".TestActivity"></activity>
  19. <!-- OAuth Version 2. 使用  WebView 辅助进行ImplicitGrant方式授权必须 -->
  20. <activity
  21. android:name="com.tencent.weibo.webview.OAuthV2AuthorizeWebView"
  22. android:label="@string/app_name" >
  23. </activity>
  24. </application>
  25. <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  26. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
  27. <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission>
  28. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
  29. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  30. <!-- 在SDCard中创建与删除文件权限 -->
  31. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  32. <!-- 往SDCard写入数据权限 -->
  33. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  34. </manifest>

接入社交平台本就是一个比较简单的功能,想跟大家说详细些,所以文章篇幅有点长,望耐心看完。

接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例的更多相关文章

  1. 用javascript得到客户端IP的新方法

    javascript得到客户端IP的新方法 很久以来,我都是经过http://fw.qq.com/ipaddress来得到客户端用户的IP,这个方法简单.快速.实用 . 我们调用它的写法是: < ...

  2. Android开发艺术探索——新的征程,程序人生路漫漫!

    Android开发艺术探索--新的征程,程序人生路漫漫! 偶尔写点东西分享,但是我还是比较喜欢写笔记,看书,群英传看完了,是学到了点东西,开始看这本更加深入Android的书籍了,不知道适不适合自己, ...

  3. 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)

    版权声明:本文由张宁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/126547001488207964 来源:腾云阁 ht ...

  4. Android开发SDK接入机智云,智能家居实现APP远程控制多设备

    代码地址如下:http://www.demodashi.com/demo/12847.html 一.前言. 此框架只用了一周星期做了出来,因为对机智云的框架比较熟悉了 !期间SDK初始化出了问题,去咨 ...

  5. 【Unity与Android】02-在Unity导出的Android工程中接入Google Admob广告

    我在上一篇文章 [Unity与Android]01-Unity与Android交互通信的简易实现) 中介绍了Unity与Android通讯的基本方法. 这一篇开始进入应用阶段,这次要介绍的是如何在An ...

  6. 轻松搭建CAS 5.x系列(4)-Java客户端程序接入CAS单点登录,Hello World版

    概述说明 按照本系列的前3篇文章描述的步骤,我们已经搭建好cas sso server.那应用程序怎么接入到实现sso呢? (如果您还没有搭建cas server,可以到<轻松搭建CAS 5.x ...

  7. CVPR2019 | 超越Mask R-CNN!华科开源图像实例分割新方法MS R-CNN

    安妮 乾明 发自 凹非寺 本文转载自量子位(QbitAI) 实习生又立功了! 这一次,亮出好成绩的实习生来自地平线,是一名华中科技大学的硕士生. 他作为第一作者完成的研究Mask Scoring R- ...

  8. SDK接入(1)之Android Facebook SDK接入

    SDK接入(1)之Android Facebook SDK接入 由于游戏已上线,且处于维护阶段,所以有空写写各种SDK接入过程和遇到的问题,也当作一种工作总结.SDK接入主流分为这么几类,登录.支付. ...

  9. quick-cocos2d-x 实现在lua里面完成android支付宝的接入

    quick-cocos2d-x 实现在lua里面完成android支付宝的接入 一.支付宝注册是很麻烦的一个过程,本文就不解释了,想了解的去官网看下注册流程.然后下载他们的sdk-WS_SECURE_ ...

  10. 【Android】Anroid5.0+新控件---酷炫标题栏的简单学习

    Android5.0+推出的新控件感觉特别酷,最近想模仿大神做个看图App出来,所以先把这些新控件用熟悉了. 新控件的介绍.使用等等网上相应的文章已经特别多了,题主也没那能力去写篇详解出来,本篇随笔记 ...

随机推荐

  1. poj 1035 Spell checker(水题)

    题目:http://poj.org/problem?id=1035 还是暴搜 #include <iostream> #include<cstdio> #include< ...

  2. mvc源码解读(20)-controller和view之查找view

    很多时候在mvc项目中我们需要去扩展自己的视图引擎,大概看起来应该下面这个样子的: public class RazorEngineExpand : RazorViewEngine { private ...

  3. Idea无法DEBUG的问题

    最近对web工程进行debug,突然发现无法进入断点了,原来以为是maven的问题,后来发现是tomcat环境变量导致的. 使用tomcat时经常碰到内存不足的情况,我们会对catalina.bat类 ...

  4. Sping表达式语言--SpEL

    Spring表达式语言---SpEL 是一个支持运行时查询和操作对象的强大的表达式语言 语法类似于EL:SpEL使用#{...}作为定界符,所有在大括号中的字符都将被认为是SpEL SpEL为bean ...

  5. Ildasm.exe(MSIL 反汇编程序)

    MSIL 反汇编程序是 MSIL 汇编程序 (Ilasm.exe) 的伙伴工具. Ildasm.exe 采用包含 Microsoft 中间语言 (MSIL) 代码的可迁移可执行 (PE) 文件,并创建 ...

  6. C++空类以及没有成员变量的类的大小

    关于C++中空类的大小为1,我们大家都有所了解,但是除了空类之外的其他一些没有成员变量的类的大小,还是有很多不明之处的. 我们来看如下一个例子: #include<iostream> us ...

  7. CSS换行:word-wrap、word-break和text-wrap区别

    一.word-wrap:允许对长的不可分割的单词进行分割并换行到下一行.(中英文处理效果一样) word-wrap有两个取值: 1.word-wrap: normal:只在允许的断字点换行(浏览器保持 ...

  8. JDK1.5新特性(五)……Typesafe Enums

    援引 Typesafe Enums - This flexible object-oriented enumerated type facility allows you to create enum ...

  9. zoj 3537 Cake 区间DP (好题)

    题意:切一个凸边行,如果不是凸包直接输出.然后输出最小代价的切割费用,把凸包都切割成三角形. 先判断是否是凸包,然后用三角形优化. dp[i][j]=min(dp[i][j],dp[i][k]+dp[ ...

  10. 自己常用的js方法

    $(function(){ tabview("#zcfw_list1"); tabview("#zcfw_list2"); tabview("#zcf ...