做了个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>

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

转载于:https://www.cnblogs.com/xiaochao1234/p/3830018.html

接入新浪、腾讯微博和人人网的Android客户端实例 接入新浪、腾讯微博和人人网的Android客户端实例...相关推荐

  1. [转]国内各大互联网公司相关技术站点2.0版 (集合腾讯、阿里、百度、搜狐、新浪、360等共49个)...

    利用闲暇时间整理了一份国内各大互联网公司的相关技术站点,希望能够对大家有所帮助,也欢迎各位帮忙补充. 腾讯系列(13)  阿里系列(18)  百度系列(3)  搜狐系列(3)  新浪系列(2)  36 ...

  2. 腾讯云IDC产品家族重装亮相 加速布局新基建

    点击上方关注我们! 在一切之后,更在一切之前. 这说的是数据中心. 也是腾讯数据中心的座右铭! 在11月25日举行的"第七届腾讯数据中心分享日"上,腾讯云IDC产品家族首次重磅亮相 ...

  3. 调用实现天气预报功能android,Android编程实现获取新浪天气预报数据的方法

    本文实例讲述了Android编程实现获取新浪天气预报数据的方法.分享给大家供大家参考,具体如下: 新浪天气预报地址: http://php.weather.sina.com.cn/xml.php?ci ...

  4. 对话腾讯安全杨勇:产业互联网带来哪些新的安全挑战

    在 2019 腾讯安全国际技术峰会上,腾讯安全平台部负责人.腾讯安全学院副院长杨勇向TechWeb等表示,产业互联网的发展给安全问题带来很多新的挑战,具体表现在三个方面. 第一,攻击面扩大,比如腾讯安 ...

  5. 【广告技术】如何提升定向广告效果?腾讯广告提出高质量负实例生成新方法

    基于CCF-腾讯犀牛鸟基金的平台支持,腾讯广告与清华大学李勇老师团队围绕分布式大规模推荐算法开展了深入的合作研究.双方最新的合作成果入选了信息检索和数据挖掘领域顶级学术会议之一ACM CIKM 202 ...

  6. 大神备赛干货:腾讯广告算法大赛冠军教你玩出大赛新高度

    2019年腾讯广告算法大赛的战鼓已然敲响.今年的大赛将广告曝光预估作为选题,紧紧贴合了最in的数字营销趋势,将理论模型应用于实践. 为了更好的帮助大家准备今年的赛事,本期我们特地邀请了李强同学为大家分 ...

  7. 万物智联下,腾讯云IoT的差异化发展之路“新”在何处?

    导语 | 科技向善是头部公司当仁不让的壮举,物联网被认为是全球新一轮科技革命与产业变革的核心驱动,而受益于良好的外部环境及市场前景,物联网产业在今后几年将继续保持快速增长.那么物联网当前的发展现状到底 ...

  8. 揭秘腾讯智慧城市版图:“数字政府”+“超级大脑”的新打法

    2015年,"互联网+"概念异军突起,成为重构商业模式的符号:2017年,"数字经济"利用后发性优势推动高新技术突飞猛进:2018年,"数字中国&qu ...

  9. 鹅鸭杀否认被腾讯收购 ;苹果已累计售出超 23.2 亿部 iPhone 手机;Android 13 测实用新功能|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  10. AI 腾讯云人脸核身之独立H5接入

    文章目录 一.概述 二.合作方后台上送身份信息~实现流程 2.1. 前端入参 2.2. 后端固定参数 2.3. 获取 Access Token 2.4. 获取 SIGN ticket 2.5. 生成签 ...

最新文章

  1. 前端面试题目汇总摘录(JS 基础篇 —— 2018.11.01更新)
  2. shell 获取文件最后一行
  3. python expect模块_成为顶级黑客--python绝技 阅读笔记(五)
  4. 浅谈js本地图片预览
  5. MMC检测到此管理单元发生一个错误。建议关闭并重新启动MMC
  6. 你的行为合理吗?看看社会心理学给我们的启示。
  7. 为什么我不建议你买保险?
  8. 小菜学设计模式——观察者模式
  9. 微软宣布SQL Server 2019免费支持Java
  10. JSP Overview
  11. 读取GY-951模块数据(Linux)
  12. 2020年百度之星程序设计大赛-初赛一(Drink、GPA、Dec)
  13. html单元格加斜线,怎样在表格中加斜线 选中第一个单元格,进入下一步
  14. 钉钉企业微信与飞书模式区别
  15. ddddocr 汉字位置识别
  16. 怎么让电脑上的图片全屏显示呢
  17. 小扎不要「脸」了?Facebook正式改名Meta!买它,满仓元宇宙
  18. Python:用【Win32】模块,结合Word通配符替换,将Word文档表格的部分内容替换为加粗
  19. 数学计算机关系论文2000字,数学与计算机科学论文2000字_数学与计算机科学毕业论文模板...
  20. 用linuxdeployqt打包程序遇到qmake找不到的问题如何解决

热门文章

  1. 美剧中常用地道英语口语,快收了
  2. Python基础(7)——for循环
  3. 19个人工智能(AI)热门应用领域,你知道多少?
  4. SAP MM PO Item Category 内部code的用处?
  5. 免费教材丨第51期:数学基础课程----概率论教程、机器学习中的数学基础
  6. 干货丨人工智能、大数据领域从菜鸟到高手的晋级指南(经典长文,值得收藏)
  7. Tensorflow— saver_restore
  8. 《用Python进行自然语言处理》第8章 分析句子结构
  9. 大脑是怎样和身体交流的?
  10. 腾讯「AI In All」的背后,是开放AI技术能力,探索腾讯应用场景