您的位置:首页 > 移动开发 > Android开发

Android 中实现分享和第三方登陆---以新浪微博为例

2017-04-20 20:44 369 查看
第三方登陆和分享功能在目前大部分APP中都有,分享功能可以将自己觉得有意义的东西分享给身边的朋友,而第三方登陆可以借助已经有巨大用户基础的平台(如QQ和新浪微博)的账号,让用户在使用自己APP的时候不用注册,直接使用第三方账号登陆,从而避免了注册的过程(其实是服务器端帮你注册),这对于吸引更多的用户非常有意义。下面我们就以新浪微博为例,讲解如何实现分享功能和第三方登陆。首先你需要到新浪微博开放平台创建一个应用:

新浪微博开放平台:http://open.weibo.com/

首先我们来介绍分享功能,分享功能就是将一些信息分享到一些社交app中,如比较热门的就是新浪微博,腾讯微博,人人网,开心网,微信,朋友圈,易信等等,在Android中 实现分享功能通常有四种方式:

方式一:使用Android自带的分享功能,通过Intent找出手机中所有的社交app

这种方式的优点就是实现比较简单,不需要引入第三方sdk,缺点就是需要安装社交app之后才能分享,其实我觉得这个也是合理的,试想如果一个人的手机中没有安装新浪微博,那么意味着他肯定不玩微博,所以不能分享也无所谓

//分享文本

Intent sendIntent = new Intent();

sendIntent.setAction(Intent.ACTION_SEND);

sendIntent.putExtra(Intent.EXTRA_TEXT, 我用手机测试分享内容);

sendIntent.setType(text/plain);

startActivity(Intent.createChooser(sendIntent, 我是弹出框的标题));

弹出界面如下:



不同人手机这个节目肯定是不一样的,因为有些人喜欢玩微博,只装了微博,没有微信。如果一个人不玩社交app,那么这个Dialog里面至少有一个是短信和蓝牙之类的,因为这些每个手机都有。

例子:

安卓系统本身可以很简便的实现分享功能,因为我们只需向startActivity传递一个
ACTION_SEND
的Intent,系统就为我们弹出一个应用程序列表,如果我们再指定intent为chooser的方式,那么这个列表就就会有个指定的标题,如下:



这就是分享界面。

其实凡是以隐式intent调用activity,如果能处理该intent的应用有多个的话,都会出现一个选择应用的对话框,这种对话框除了列出应用列表,还为你提供是永久选择,还是只是这次选择。比如我们发送了这样一个浏览网页的intent:

String url = "http://www.example.com";

Intent i = new Intent(Intent.ACTION_VIEW);

i.setData(Uri.parse(url));

startActivity(i);

那么系统会为我们列出能接收这个intent的应用(一般浏览器都会实现,相当于一种约定),界面如下:


注意上面的对话框只是单纯列出了应用,而且比分享对话框还多了两个选择方式的按钮,所以仅仅这样还不符合分享功能的需求。

分享的需求有两点:

每次都列出所有应用;

不再提示只是一次选择还是永久选择;

为此,我们需要通过Intent来创建chooser:

Intent chooserIntent = Intent.createChooser(intent, "Select app to share");

intent的createChooser
方法调用后,上面提到的两个不符合需求的问题就不存在了,其实这就是分享功能的本质,他只不过是利用了Intent的机制而已。

利用系统的api实现分享的代码如下:

Intent intent = new Intent(Intent.ACTION_SEND);

intent.setType("text/plain");

intent.putExtra(Intent.EXTRA_TITLE, title);

intent.putExtra(Intent.EXTRA_SUBJECT, subject);

intent.putExtra(Intent.EXTRA_TEXT, content);

Intent chooserIntent = Intent.createChooser(intent, "Select app to share");

if (chooserIntent == null) {

return;

}

try {

startActivity(chooserIntent);

} catch (android.content.ActivityNotFoundException ex) {

Toast.makeText(this, "Can't find share component to share", Toast.LENGTH_SHORT).show();

}

一般,通过上面的代码,提供的分享方式有各种应用:邮件,信息,蓝牙,微博,Twitter,二维码扫描器等。

但是,第一:我想过滤掉蓝牙,

其次:我想对邮件分享详细的内容,对信息和微博等分享较简短的内容,对二维码扫描器只分享URL。

解决的办法是得到所有能处理
ACTION_SEND
的应用程序包名,然后根据名字来过滤或者特殊处理。主要用到
getPackageManager().queryIntentActivities
方法。

String contentDetails = "";

String contentBrief = "";

String shareUrl = "";

Intent it = new Intent(Intent.ACTION_SEND);

it.setType("text/plain");

List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(it, 0);

if (!resInfo.isEmpty()) {

List<Intent> targetedShareIntents = new ArrayList<Intent>();

for (ResolveInfo info : resInfo) {

Intent targeted = new Intent(Intent.ACTION_SEND);

targeted.setType("text/plain");

ActivityInfo activityInfo = info.activityInfo;

// judgments : activityInfo.packageName, activityInfo.name, etc.

if (activityInfo.packageName.contains("bluetooth") || activityInfo.name.contains("bluetooth")) {

continue;

}

if (activityInfo.packageName.contains("gm") || activityInfo.name.contains("mail")) {

targeted.putExtra(Intent.EXTRA_TEXT, contentDetails);

} else if (activityInfo.packageName.contains("zxing")) {

targeted.putExtra(Intent.EXTRA_TEXT, shareUrl);

} else {

targeted.putExtra(Intent.EXTRA_TEXT, contentBrief);

}

targeted.setPackage(activityInfo.packageName);

targetedShareIntents.add(targeted);

}

Intent chooserIntent = Intent.createChooser(targetedShareIntents.remove(0), "Select app to share");

if (chooserIntent == null) {

return;

}

// A Parcelable[] of Intent or LabeledIntent objects as set with

// putExtra(String, Parcelable[]) of additional activities to place

// a the front of the list of choices, when shown to the user with a

// ACTION_CHOOSER.

chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedShareIntents.toArray(new Parcelable[] {}));

try {

startActivity(chooserIntent);

} catch (android.content.ActivityNotFoundException ex) {

Toast.makeText(this, "Can't find share component to share", Toast.LENGTH_SHORT).show();

}

}

如果我们想指定一个应用来分享,那么可以将上面的代码做些修改:

private void initShareIntent(String type) {

boolean found = false;

Intent share = new Intent(android.content.Intent.ACTION_SEND);

share.setType("image/jpeg");

// gets the list of intents that can be loaded.

List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(share, 0);

if (!resInfo.isEmpty()){

for (ResolveInfo info : resInfo) {

if (info.activityInfo.packageName.toLowerCase().contains(type) ||

info.activityInfo.name.toLowerCase().contains(type) ) {

share.putExtra(Intent.EXTRA_SUBJECT, "subject");

share.putExtra(Intent.EXTRA_TEXT, "your text");

share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(myPath)) ); // Optional, just if you wanna share an image.

share.setPackage(info.activityInfo.packageName);

found = true;

break;

}

}

if (!found)

return;

startActivity(Intent.createChooser(share, "Select"));

}

}

然后在需要分享的地方加上:

initShareIntent("twi");

其实这种方法的前提是你必须知道某个应用的包名大致是什么样,比如qq的微信和微博的包名其实没有qq

initShareIntent(
"qq"
);是没有用的,你可以先将他们打印出来看长什么样子,然后在调用。以下是我总结的一些常用应用包名:


case ID_QQWEIBO:

initShareIntent("com.tencent.wblog");

break;

case ID_WEIXIN:

initShareIntent("com.tencent.mm");

break;

case ID_EVERNOTE:

initShareIntent("evernote");

break;

case ID_SINAWEIBO:

initShareIntent("com.sina.weibo");

break;

case ID_RENREN:

initShareIntent("renren");

break;

case ID_QQ:

initShareIntent("tencent.mobileqq");

break;

方式二:使用ShareSDK实现,ShareSDK是一款功能非常强大的第三方提供的专门用于分享等功能的sdk,使用也很简单,但是需要引入一些sdk,这里我就不举例了,研究一些ShareSDK提供的demo就可以实现,优点是简单,功能强大,并且不需要安装社交app

方式三:使用社交开放平台提供的sdk,有点事简单,但是需要安装社交app

方式四:使用社交平台提供的api接口,通过调用这些api接口实现分享和登陆,使用这种不需要安装社交app

本文着重介绍第四种方式,并以新浪微博为例:

1、创建微博授权所需参数的持久化类

?
2、创建一个类,用来实分享和登陆功能,当然你需要引入新浪微博的sdk:weibosdkcore.jar,这个jar包在新浪微博开放平台下提供下载。

?
3、分享微博

?
那么分享到这里就完成了,至于第三方登陆,首先也是要认证,认证成功后AccessToken里面有一个Uid,我们通过这个uid拿到用户信息然后帮助用户在后台注册就实现了第三方登陆了,代码如下:

?
思路其实和分享是一样的,就是调用的接口不一样。

好了,先写到这里,其实如果你学会了分享和登陆,那么其实你完全可以自己去写一个新浪微博,因为这个jar包里面提供了新浪微博所有操作的api,如获取某人发的所有微博,获取粉丝,自己关注的人等等,其实网上很多新浪微博开发的例子都是通过这个方法实现的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐