友盟+搜索

{{errorMsg}}

概述

友盟分享分为两种形式:

  • 分享面板分享,用户可以调用我们提供的默认分享面板UI,打开分享面板,然后点击分享面板的对应平台进行分享
  • 直接分享,用户可以自己写分享按钮,或者触发事件,然后调用我们的分享方法,进行分享。

打开分享面板

打开分享面板之前需要工程配置,请参考配置文档

在需要弹出分享面板选择页的地方调用下列代码

new ShareAction(MainActivity.this).withText("hello")
                        .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN)
                        .setCallback(umShareListener).open();

setDisplayList中设置的枚举参数就是最终分享面板中显示的平台,所传入参数的顺序即为最终面板分享平台的排列顺序

onActivityResult实现方法如下:

@Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);

    }

弹出面板后的效果如下:

打开面板的使用方式与分享类似,只是一个设置单一的使用平台,一个设置一个平台list,一个最后调用的是share方法,一个调用open的方法。关于分享面板的UI修改方法,可以参照分享面板进阶

直接分享

简而言之,直接分享就是在用户自己的界面组件中插入分享行为

分享之前需要工程配置,请参考配置文档

分享可以通过如下代码实现,不同平台只要传入不同的SHARE_MEDIA即可。

new ShareAction(MainActivity.this).setPlatform(SHARE_MEDIA.QQ)
                        .withText("hello")
                        .setCallback(umShareListener)
                        .share();

其中umShareListener为回调监听,构建如下,其中分享成功会回调onComplete,取消分享回调onCancel,分享错误回调onError,对应的错误信息可以用过onError的Throwable参数来打印

    private UMShareListener umShareListener = new UMShareListener() {
     @Override
        public void onStart(SHARE_MEDIA platform) {
           //分享开始的回调
        }
        @Override
        public void onResult(SHARE_MEDIA platform) {
            Log.d("plat","platform"+platform);

                Toast.makeText(MainActivity.this, platform + " 分享成功啦", Toast.LENGTH_SHORT).show();

        }

        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
            Toast.makeText(MainActivity.this,platform + " 分享失败啦", Toast.LENGTH_SHORT).show();
            if(t!=null){
                Log.d("throw","throw:"+t.getMessage());
            }
        }

        @Override
        public void onCancel(SHARE_MEDIA platform) {
            Toast.makeText(MainActivity.this,platform + " 分享取消了", Toast.LENGTH_SHORT).show();
        }
    };

onActivityResult实现方法如下:

@Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);

    }

更多分享类型请参见分享进阶文档或参照demo。

分享内容进阶

对于分享内容可以有如下设置

设置分享图片

在使用shareaction的时候,调用withMedia可以设置一个UMImage,也就是分享图片,分享图片的构建有如下几种形式

    UMImage image = new UMImage(ShareActivity.this, "imageurl");//网络图片
    UMImage image = new UMImage(ShareActivity.this, file);//本地文件
    UMImage image = new UMImage(ShareActivity.this, R.drawable.xxx);//资源文件
    UMImage image = new UMImage(ShareActivity.this, bitmap);//bitmap文件
    UMImage image = new UMImage(ShareActivity.this, byte[]);//字节流

推荐使用网络图片和资源文件的方式,平台兼容性更高。 对于微信QQ的那个平台,分享的图片需要设置缩略图,缩略图的设置规则为:

    UMImage thumb =  new UMImage(this, R.drawable.thumb);
    image.setThumb(thumb);

用户设置的图片大小最好不要超过250k,缩略图不要超过18k,如果超过太多(最好不要分享1M以上的图片,压缩效率会很低),图片会被压缩。 用户可以设置压缩的方式:


image.compressStyle = UMImage.CompressStyle.SCALE;//大小压缩,默认为大小压缩,适合普通很大的图
image.compressStyle = UMImage.CompressStyle.QUALITY;//质量压缩,适合长图的分享
压缩格式设置:

image.compressFormat = Bitmap.CompressFormat.PNG;//用户分享透明背景的图片可以设置这种方式,但是qq好友,微信朋友圈,不支持透明背景图片,会变成黑色

创建好UMImage之后调用分享即可,如下所示:

    new ShareAction(ShareActivity.this).withText("hello")
                                 .withMedia(image).share();

设置分享链接

分享链接可以使用UMWeb进行分享:

UMWeb  web = new UMWeb(Defaultcontent.url);
        web.setTitle("This is music title");//标题
        web.setThumb(thumb);  //缩略图
        web.setDescription("my description");//描述

然后调用将这个参数设置到ShareAction中:

new ShareAction(ShareActivity.this)
    .withMedia(web)
    .share();

设置分享音乐

音乐只能使用网络音乐:

UMusic music = new UMusic(musicurl);
music.setTitle("This is music title");//音乐的标题
music.setmTargetUrl(Defaultcontent.url);//QQ好友微信好友可以设置跳转链接
music.setThumb("http://www.umeng.com/images/pic/social/chart_1.png");//音乐的缩略图
music.setDescription("my description");//音乐的描述

建立好之后可以进行分享:

new ShareAction(ShareActivity.this).withText("hello")
                               .withMedia(music).share();      

为什么设置了音乐的url还要设置TargetUrl,这是因为在微信qq分享音乐,是可以在当前聊天界面播放的,要求这个musicurl必须要以.mp3等音乐格式结尾,然后点开这个linkcard可以跳转到一个网页,这个网页就可以是一个随机的网页。

设置分享视频

音乐只能使用网络视频:

UMVideo video = new UMVideo(videourl);
video.setTitle("This is music title");//视频的标题
video.setThumb("http://www.umeng.com/images/pic/social/chart_1.png");//视频的缩略图
video.setDescription("my description");//视频的描述

建立好之后可以进行分享:

new ShareAction(ShareActivity.this).withText("hello")
                               .withMedia(video).share(); 

设置Emoji

分享Emoji是在微信中使用分享动态图的

UMEmoji emoji = new UMEmoji(this,"http://img5.imgtn.bdimg.com/it/u=2749190246,3857616763&fm=21&gp=0.jpg");

emoji.setThumb(new UMImage(this, R.drawable.thumb));
new ShareAction(ShareActivity.this)
          .withMedia(emoji).share(); 


设置分享文件

分享文件是有微信收藏和邮件中可以使用,别的平台无效,使用的文件不要超过10M

new ShareAction(ShareActivity.this).withText("hello")
                               .withFile(file).share();   

各平台可分享内容预览

平台 是否支持登录 可分享内容 是否支持获取用户信息
QQ 图片 链接 视频 音乐
Qzone 文字(说说) 图片(说说) 链接 视频 音乐
微信 文本 图片 链接 视频 音乐
微信朋友圈 文本 图片 链接(Description不会显示) 视频 音乐
新浪微博 文本 图片 链接 视频 音乐
腾讯微博 是(网页) 文本 图片 链接 视频 音乐
支付宝 文本 图片 链接 视频 音乐
钉钉 文本 图片 链接 视频 音乐
易信/朋友圈 文本 图片 链接 视频 音乐
人人 是(网页) 文本 图文 图片 链接 视频 音乐
豆瓣 是(网页) 文本 图文 图片 链接 视频 音乐
点点虫动态 文本 图文 图片 链接 视频 音乐
微信收藏 文本 图片 链接 视频 音乐 文件
LinkedIn 文本 图文 图片 链接 视频 音乐
Facebook 图片 链接 视频
Facebook Messenger 图片 链接 视频
Twitter 文本 图文 图片
短信 文本 图文 图片 链接
邮件 文本 图文 图片
Instagram 图片
Pinterest 图文 图片
Tumblr 文本 图文 图片
line 文本 图文 图片
whatsapp 文本 图文 图片
flickr 图片
kakao 文本 图文 图片
googleplus 文本 图文 图片
印象笔记 文本 图片 图文
有道笔记 文本 图片 图文
pocket 链接
foursquare 图片

分享UI修改

分享面板UI修改

对分享面板有修改需求的开发者查看 自定义UI文档

增加自定义分享按钮

如果需要对分享面板增加自定义的按钮,可以通过

new ShareAction(ShareMenuActivity.this).setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.QZONE)
                        .addButton("umeng_sharebutton_custom","umeng_sharebutton_custom","info_icon_1","info_icon_1")
                        .setShareboardclickCallback(shareBoardlistener).open();

进行设置其中第一个参数是显示的名字,第二个参数是平台名称,第三个参数是按钮图标的图片名字,第四个按钮是置灰情况下按钮图标的图片名字。 注意第一个参数和第二个参数是指字符串写在string文件中的名字,如

  <string name="umeng_sharebutton_custom">自定义分享按钮</string>

第三个参数与第四个参数为图片的名字 对于自定义平台的监听需要使用上面提到的分享面板点击回调,如下:

      private ShareBoardlistener shareBoardlistener = new  ShareBoardlistener() {

        @Override
        public void onclick(SnsPlatform snsPlatform,SHARE_MEDIA share_media) {
            if (share_media==null){
                if (snsPlatform.mKeyword.equals("umeng_sharebutton_custom")){
                    Toast.makeText(ShareActivity.this,"add button success",Toast.LENGTH_LONG).show();
                }

            }
            else {
                new ShareAction(ShareActivity.this).setPlatform(share_media).setCallback(umShareListener)
                        .withText("多平台分享")
                        .share();
            }
        }
    };

新增按钮的回调监听是通过判断当获取平台为空时,keyword的值来进行确定的,并在对应的条件中进行处理即可。

分享编辑页UI修改

分享编辑页只能在新浪精简版,人人,豆瓣中使用,是在umeng_social_shareview.jar中 该编辑页的自定义只支持umeng_socialize_share.xml中的配置,具体组件对应如下

特殊功能及接口调用

android6.0适配

因为分享授权中需要使用一些对应的权限,如果你的targetSdkVersion设置的是23或更高,需要提前获取权限。(如果targetSdkVersion是22或以下,可以忽略该问题)

使用AppCompatActivity.checkSelfPermission(Manifest.permission.xxxx)可以判断权限的授权情况。

使用

if(Build.VERSION.SDK_INT>=23){
                  String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.CALL_PHONE,Manifest.permission.READ_LOGS,Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.SET_DEBUG_APP,Manifest.permission.SYSTEM_ALERT_WINDOW,Manifest.permission.GET_ACCOUNTS,Manifest.permission.WRITE_APN_SETTINGS};
                  ActivityCompat.requestPermissions(this,mPermissionList,123);
              }

可以请求权限。

对应平台没有安装的时候跳转转到应用商店下载

在初始化sdk的时候添加如下代码即可:

Config.isJumptoAppStore = true

其中qq 微信会跳转到下载界面进行下载,其他应用会跳到应用商店进行下载

获取客户端安装信息

使用如下接口

mShareAPI.isInstall(this, SHARE_MEDIA.WEIXIN)

获取客户端api是否支持的接口

mShareAPI.isSupport(this, SHARE_MEDIA.WEIXIN)

获取当前使用sdk的版本号

mShareAPI.getversion(this, SHARE_MEDIA.WEIXIN)

qq微信新浪授权防杀死

对于的低端手机可能会有如下问题,从开发者app调到qq或者微信的授权界面,后台把开发者app杀死了,这样,授权成功没有回调了,可以用如下方式避免:(一般不需要添加,如有特殊需要,可以添加)

在使用的activity中重写onSaveInstanceState方法:

 @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        UMShareAPI.get(this).onSaveInstanceState(outState);
    }

在onCreate中调用:

UMShareAPI.get(this).fetchAuthResultWithBundle(this, savedInstanceState, new UMAuthListener() {
            @Override
            public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {

            }

            @Override
            public void onError(SHARE_MEDIA platform, int action, Throwable t) {

            }

            @Override
            public void onCancel(SHARE_MEDIA platform, int action) {

            }
        });

也就是在onCreate中再设置一次回调

内存泄漏

在使用分享或者授权的Activity中,重写onDestory()方法:

 @Override
    protected void onDestroy() {
        super.onDestroy();
        UMShareAPI.get(this).release();
    }

关闭log和toast方法:

在初始化sdk的地方

Log.LOG = false

水印

在6.2之后的版本之后,开发者可以使用调用我们的方法添加水印。需要注意的是,控制添加水印图片的大小,防止OOM 首先使用水印功能,需要额外的umeng_social_tool.jar,不使用水印功能,可以不用添加。 然后调用方法,进行添加:

 UMImageMark umImageMark = new UMImageMark();
        umImageMark.setGravity(Gravity.BOTTOM | Gravity.RIGHT);
        umImageMark.setMarkBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.umeng_socialize_twitter));
        umImageMark.setAlpha(xxxx)//设置透明度
         umImageMark.setMargins(left,top,right,bottom)//设置边距

然后将构建好的umImageMark放入要分享的UMImage中即可:

  imagelocal = new UMImage(this,R.drawable.logo,umImageMark);

需要注意的是本地文件和网络链接的图片形式,不支持添加水印。