之前项目中集成过多次友盟的分享,当时做完后没有写博客记录,然后现在公司的项目市场是国外主要,用到的都是Facebook分享和Android原生的系统分享,所以也用不到国内社交平台的分享集成,但是今天个人的项目里面需要用到集成友盟了,由于当时没有用博客记笔记详细记录,所以再次集成的时候很多都忘了,之前爬过的坑有的甚至重新爬了一次又,所以感觉有必要认真的做下笔记了!于是有了今天这篇博客~,哈哈
第一步:在友盟开放平台注册账号,创建应用并获取到对应的友盟的key值;
第二步:为自己的应用在常用的社交软件开放平台申请创建应用,并提交审核获取对应的appkey和secret;
第三步:从友盟平台下载对应的友盟的jar包,我这里用的都是精简版的jar包,qq,微信,微博都是用的精简版的jar包,将jar包复制到项目的libs目录下并在build.gradle文件中添加依赖;
第四步:在项目的清单文件AndroidManifest.xml文件中进行各个社交平台的活动配置和友盟key的配置
<meta-data
android:name="UMENG_APPKEY"
android:value="5a7a6c3fa40fa355170002323" >
</meta-data>
<!--第三方分享 新浪-->
<activity
android:name="com.umeng.socialize.media.WBShareCallBackActivity"
android:configChanges="keyboardHidden|orientation"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="false"
android:screenOrientation="portrait" >
</activity>
<!--<activity android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity"-->
<activity
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:launchMode="singleTask"
android:name="com.sina.weibo.sdk.share.WbShareTransActivity">
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!--qq精简版-->
<activity
android:name="com.umeng.qq.tencent.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="1177678592" /> <-- 填写你在腾讯应用平台申请下来的应用的appid-->
</intent-filter>
</activity>
<activity
android:name="com.umeng.qq.tencent.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"/>
<activity android:name=".wxapi.WXEntryActivity"/>
第五步:在application类中进行初始化sdk
//注意这里的微信的secret要用签名工具生成md5值复制到这里,注意手机上装的你的应用一定是reslease版本的,否则获取到的md5值正式环境分享时会出问题,这里附上签名工具的下载地址,由于md5值是一样的,我直接用的微博的md5签名工具,这里附上下载地址:
[微博的md5签名工具下载地址](https://github.com/mobileresearch/weibo_android_sdk/blob/master/%E5%BE%AE%E5%8D%9AAndroid%E5%B9%B3%E5%8F%B0SDK%E6%96%87%E6%A1%A3V2.4.0.pdf)
//微信开放平台申请下离的应用id和md5签名工具生成的md5值
PlatformConfig.setWeixin("wx9b5134440f179efd", "4efdff8ea6cd8070682a3866c0f444ae");
//从腾讯开放平台获取你申请的qq分享相关的appid和screct值
PlatformConfig.setQQZone("11066785552", "hus3kuqIGq055qUN");
//从微博开放平台获取你的appkey和screct值
PlatformConfig.setSinaWeibo("1844955595", "2119f6551d01695b6555555693d575", "http://sns.whalecloud.com");
第六步:开始核心的代码部分
我将核心的分享代码封装到了工具类ShareUtil中,便于调用各处:
工具类ShareUtil.kt代码:
class SharerUtil :View.OnClickListener{
val TAG = "SharerUtil"
private val PERMISSIONS_STORAGE = arrayOf("android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE")
private val REQUEST_EXTERNAL_STORAGE = 1
var dialog: AlertDialog?= null
var activity: Activity? = null
var webUrl:String?= null
var UMimgUrl:String?= null
var title:String?= null
var description:String?= null
constructor (activity: Activity) {
this.activity = activity
}
companion object{
//Android原生系统分享,缺点不能自定义分享的布局
open fun shareMore(activity: Activity,url:String){
val textIntent = Intent(Intent.ACTION_SEND)
textIntent.type = "text/plain"
textIntent.putExtra(Intent.EXTRA_TEXT, url)
activity!!.startActivity(Intent.createChooser(textIntent, "Share"))
}
}
open fun showShareDialog(webUrl:String,UMimgUrl:String,title:String,description:String) {
this.webUrl = webUrl
this.UMimgUrl = UMimgUrl
this.title = title
this.description = description
var view = LayoutInflater.from(activity).inflate(R.layout.share_public_view, null, false)
dialog = AlertDialog.Builder(activity).setView(view).create()
view.tv_cancle.setOnClickListener(this)
view.ll_shareto_weicheat.setOnClickListener(this)
view.ll_jubao_jcdetial.setOnClickListener(this)
view.ll_shareto_weicheatRrang.setOnClickListener(this)
view.ll_shareto_qq.setOnClickListener(this)
view.ll_shareto_weibo.setOnClickListener(this)
view.ll_shareto_qqspace.setOnClickListener(this)
dialog!!.show()
//此处设置位置窗体大小,我这里设置为了手机屏幕宽度的3/4
dialog!!.getWindow().setLayout((ScreenUtils.getScreenWidth(activity)),RelativeLayout.LayoutParams.WRAP_CONTENT)
}
override fun onClick(v: View?) {
when(v!!.id){
R.id.tv_cancle->{
dialog!!.dismiss()
}
R.id.ll_shareto_weicheat->{
initShareType(SHARE_MEDIA.WEIXIN,webUrl,UMimgUrl,title,description)
}
R.id.ll_shareto_weicheatRrang->{
initShareType(SHARE_MEDIA.WEIXIN_CIRCLE, webUrl, UMimgUrl, title, description)
}
R.id.ll_shareto_qq->{
initShareType(SHARE_MEDIA.QQ,webUrl, UMimgUrl, title, description)
}
R.id.ll_shareto_weibo->{
initShareType(SHARE_MEDIA.SINA,webUrl, UMimgUrl, title, description)
}
R.id.ll_shareto_qqspace->{
initShareType(SHARE_MEDIA.QZONE,webUrl, UMimgUrl, title, description)
}
R.id.ll_jubao_jcdetial->{
}
}
}
private fun initShareType(shareType: SHARE_MEDIA, webUrl: String?, uMimgUrl: String?, title: String?, description: String?) {
val thumb2 = UMImage(activity, uMimgUrl!!)
val web2 = UMWeb(webUrl)
web2.title = title//标题
web2.setThumb(thumb2) //缩略图
web2.description = description//描述
ShareAction(activity)
.setPlatform(shareType)//传入平台
.withMedia(web2)
.setCallback(object : UMShareListener {
override fun onStart(share_media: SHARE_MEDIA) {
Toast.makeText(activity, "分享开始", Toast.LENGTH_LONG).show()
}
override fun onResult(share_media: SHARE_MEDIA) {
Toast.makeText(activity, "成功了", Toast.LENGTH_LONG).show()
}
override fun onError(share_media: SHARE_MEDIA, throwable: Throwable) {
Toast.makeText(activity, "异常:"+throwable.message, Toast.LENGTH_LONG).show()
verifyStoragePermissions(activity!!)
}
override fun onCancel(share_media: SHARE_MEDIA) {
Toast.makeText(activity, "取消分享", Toast.LENGTH_LONG).show()
}
})
.share()
}
//qq分享需要读写sd卡权限,如果没有这个方法分享时会出现异常,实际上这个检查权限的方法应该在分享的activity初始化的生命周期方法里面进行,我在这里也写了,当分享失败的时候会再次检查申请权限
fun verifyStoragePermissions(activity: Activity) {
try {
//检测是否有写的权限
val permission = ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE")
if (permission != PackageManager.PERMISSION_GRANTED) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE)
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
关键调用代码:
//记得在activity的oncreate方法中申请检查读写sd卡的权限,否则会分享异常
verifyStoragePermissions(activity!!)
//当点击分享的按钮后调用下面方法进行弹出分享对话框布局视图
fun share(){
var sharerUtil: SharerUtil? = SharerUtil(this)
sharerUtil!!.showShareDialog("http://www.mingshiapp.top:8080/AllThingArePosible/sharePage1",
articleDetailBean?.info?.headerImage!!, articleDetailBean?.info?.title!!,"作者:"+ articleDetailBean?.info?.trends_autor_name!!)
}
强调一点记得在调用的activity中重写这个方法,否则会有异常出现
// QQ与新浪不需要添加Activity,但需要在使用QQ分享或者授权的Activity中,添加
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
super.onActivityResult(requestCode, resultCode, data)
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data)
}
然后到这里就集成成功了,集成分享的坑有时候会遇到很多莫名其妙的,如果你也遇到了或者有不明白的地方可以在文章底部留言给我,我看到后会第一时间回复,我们可以一起探讨,交流,学习进步!