友盟社会化分享+第三方登录 2022.03.28 最新版


采用gradle集成方式:友盟文档: https://developer.umeng.com/docs/128606/detail/193879

1、build.gradle 配置

在build.gradle中添加友盟 " maven { url ‘https://repo1.maven.org/maven2/’} "

// Top-level build file where you can add configuration options common to all sub-projects/modules.
apply from: "config.gradle"
buildscript {
    repositories {
    ...
        //友盟
        maven { url  'https://repo1.maven.org/maven2/'}
  
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
    }
}

allprojects {
    repositories {
    ...
        //友盟
        maven { url  'https://repo1.maven.org/maven2/'}
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2、app 文件夹下build.gradle添加以下内容

...
android {
    ...
    defaultConfig {
       ..
       ndk {
            //选择要添加的对应 cpu 类型的 .so 库。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86'
           
        }
manifestPlaceholders = [
				//极光
                JPUSH_PKGNAME: applicationId,
                JPUSH_APPKEY : "***********", //JPush 上注册的包名对应的 Appkey.
                JPUSH_CHANNEL: "developer-default", //暂时填写默认值即可.
                //QQ AppID
                qqappid      : "自己申请的",
        ]
    }
    buildTypes {
        ....
    }

    //aar
    repositories {
        flatDir {
            dirs 'libs'
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

}
//如果以下内容是放在module 中 implementation 改成api 就可以
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //基础组件库
    //必选
    api  'com.umeng.umsdk:common:9.4.4'
    //必选
    api  'com.umeng.umsdk:asms:1.4.1'
    //集成U-Link,可选,如要统计分享回流次数和分享新增用户指标则必选
    //api 'com.umeng.umsdk:link:1.1.0'

    //U-Share SDK
    api  'com.umeng.umsdk:share-core:7.1.7'//分享核心库,必选
    api  'com.umeng.umsdk:share-board:7.1.7'//分享面板功能,可选

    api 'com.umeng.umsdk:share-wx:7.1.7' //微信完整版
    api 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:6.7.9'//微信官方依赖库,必选

    api 'com.umeng.umsdk:share-qq:7.1.7'//QQ完整版
    api files('libs/open_sdk_3.5.7.4_r1bc9afe_lite.jar')//QQ官方依赖库,必选
    api 'com.squareup.okhttp3:okhttp:3.14.9'//QQ SDK在3.53.0版本及以上时需要集成okhttp官方依赖库,必选

    api 'com.umeng.umsdk:share-sina:7.1.7'//新浪微博完整版
    api 'io.github.sinaweibosdk:core:11.11.1@aar'//新浪微博官方SDK依赖库,必选
//    api files('libs/openDefault-10.10.0.aar')

}

3、androidManifest.xml 配置

以下内容不需要配置

<application>
            <!-- QQ配置  start   -->
<!--            <activity-->
<!--                android:name="com.tencent.tauth.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="tencent+appid" />-->
<!--                </intent-filter>-->
<!--            </activity>-->

<!--            &lt;!&ndash;        这个配置可以解决QQ分身的背景透明度 &ndash;&gt;-->
<!--            <activity-->
<!--                android:name="com.tencent.connect.common.AssistActivity"-->
<!--                android:configChanges="orientation|keyboardHidden|screenSize"-->
<!--                tools:replace="android:configChanges"-->
<!--                android:theme="@android:style/Theme.Translucent.NoTitleBar" />-->

            <!-- QQ配置  end -->

            <!-- 友盟分享编辑页(只有新浪微博精简版,豆瓣人人腾讯微博需要)-->
           <!--   <activity
                android:name="com.umeng.socialize.editorpage.ShareActivity"
                android:excludeFromRecents="true"
                android:screenOrientation="portrait"
                android:theme="@style/Theme.UMDefault" />
                -->
        </application>

不然会提示

Manifest merger failed : Attribute data@scheme at AndroidManifest.xml requires a placeholder substitution but no value for is provided.

主要原因是
QQ SDK中有配置,只需要在build.gradle中配置"qqappid"(详情见步奏2) manifestPlaceholders =[qqappid : “自己申请的”,]
另外友盟SDK最新版引用的QQ、微信SDK和官方的一至!!

4、包目录下创建 wxapi 目录 添加 WXEntryActivity.class 文件

package 你的包名.wxapi;
import com.umeng.socialize.weixin.view.WXCallbackActivity;

public class WXEntryActivity extends WXCallbackActivity {
}

5、res/xml/file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
  ....
        <!-- QQ 官方分享SDK 共享路径 -->
        <root-path name="opensdk_root" path=""/>
        <external-files-path name="opensdk_external" path="Images/tmp"/>
        <!-- 友盟微信分享SDK 共享路径-->
        <external-files-path name="umeng_cache" path="umeng_cache/"/>
        <!-- 新浪微博 官方分享SDK 10.10.0共享路径 -->
        <external-files-path name="share_files" path="." />
    </paths>
</resources>

5、app 里面的 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="你的包名">
...
		//Android11 在应用的AndroidManifest.xml添加如下<queries>标签
    <queries>
        <package android:name="com.tencent.mm" />            // 指定微信包名
        <package android:name="com.tencent.mobileqq" />    //指定qq包名
        <package android:name="com.sina.weibo" />             //指定微博包名
        <package android:name="com.qzone" />                   //指定QQ空间包名
    </queries>
    //或者
    <!--查看应用是否已安装·Android 11 新增-->
    <uses-permission
        android:name="android.permission.QUERY_ALL_PACKAGES"
        tools:ignore="QueryAllPackagesPermission" />
    <application
        >
        ...
<!--文件访问配置-->
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <!-- 元数据 -->
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                tools:replace="android:resource"
                android:resource="@xml/file_paths" />
        </provider>
        ...
         </application>
</manifest>

6、调用功能的对应Activity 配置

	@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //QQ 回调需要
        UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
     }
        
    @Override
    public void onDestroy() {
        super.onDestroy();
        UMShareAPI.get(this).release();
     }

7、分享调用

/**
     * 面板分享
     */
    public static void startShare(Activity activity, ShareBean shareBean, UMShareListener shareListener) {
        new ShareAction(activity)
                .setDisplayList(SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.WEIXIN, SHARE_MEDIA.QZONE, SHARE_MEDIA.QQ)
                .setCallback(shareListener)
                .withMedia(shareBean.getUmWeb())
                .open();
    }
    /**
     * 直接分享
     */
    public static void startShare(Activity activity, UMImage image, SHARE_MEDIA media,
                                  UMShareListener shareListener) {
        new ShareAction(activity).setPlatform(media)
                .setCallback(shareListener)
                .withMedia(image)
                .share();
    }

   public UMShareListener umShareListener = new UMShareListener() {
        @Override
        public void onStart(SHARE_MEDIA share_media) {
        }

        @Override
        public void onResult(SHARE_MEDIA share_media) {
            ToastUtils.show(getString(R.string.str_share_success));
        }

        @Override
        public void onError(SHARE_MEDIA share_media, Throwable throwable) {
            SpDialog.dismiss();
            if (throwable.getMessage().contains("2008")) {
                if (share_media == SHARE_MEDIA.WEIXIN_CIRCLE || share_media == SHARE_MEDIA.WEIXIN) {
                    ToastUtils.show("您没有安装微信,请安装微信");
                } else if (share_media == SHARE_MEDIA.QZONE || share_media == SHARE_MEDIA.QQ) {
                    ToastUtils.show("您没有安装QQ,请先安装QQ");
                }
            } else {
                ToastUtils.show(getString(R.string.str_share_error));
            }
        
        }

        @Override
        public void onCancel(SHARE_MEDIA share_media) {
            ToastUtils.show(getString(R.string.str_share_cancel));
          
        }
    };

8、微信、QQ登录

UMShareAPI.get(this).getPlatformInfo(this, platformType, authListener);

/**
     * 友盟umAuthListener为授权回调
     */
    UMAuthListener authListener = new UMAuthListener() {
        /**
         * @desc 授权开始的回调
         * @param platform 平台名称
         */
        @Override
        public void onStart(SHARE_MEDIA platform) {

        }

        /**
         * @desc 授权成功的回调
         * @param data 用户资料返回
         * 登录成功后,第三方平台会将用户资料传回,
         * 全部会在Map data中返回 ,由于各个平台对于用户资料的标识不同,因此为了便于开发者使用,我们将一些常用的字段做了统一封装,开发者可以直接获取
         * 字段说明
         * UShare封装后字段名   QQ原始字段名   微信原始字段名   新浪原始字段名   字段含义  备注
         * uid  openid  unionid    id   用户唯一标识  uid能否实现Android与iOS平台打通,目前QQ只能实现同APPID下用户ID匹配
         * name    screen_name     screen_name     screen_name     用户昵称
         * gender  gender  gender  gender  用户性别    该字段会直接返回男女
         * iconurl profile_image_url   profile_image_url   profile_image_url   用户头像
         */
        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            LogUtils.d("第三方平台信息:" + data.toString());
        }

        /**
         * 授权失败的回调
         */
        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
           
        }

        /**
       授权取消的回调
         */
        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {
           
        }
    };

9、初始化

Application 的onCreate()方法

 /**
     * 初始化友盟分享
     */
    private void initUMeng() {

        //设置LOG开关,默认为false
        UMConfigure.setLogEnabled(true);
        //友盟预初始化
        UMConfigure.preInit(getApplicationContext(),"友盟ID","Umeng");

        //判断是否同意隐私协议,uminit为1时为已经同意,直接初始化umsdk
        if(MyUtils.getString((String) SPUtils.get(SpConstant.uminit,"")).equals("1")){
            //友盟正式初始化
            UmInitConfig umInitConfig=new UmInitConfig();
            umInitConfig.UMinit(getApplicationContext());
        }

    }

UmInitConfig .class
1、Andriod 11必须要调用PlatformConfig.setWXFileProvider、PlatformConfig.setQQFileProvider等等,否则分享本地图片到微信、QQ、微博平台会失败


public class UmInitConfig {

  public  void  UMinit(Context context){

        //初始化组件化基础库, 统计SDK/推送SDK/分享SDK都必须调用此初始化接口
        UMConfigure.init(context, "友盟ID", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "");

        String FileProvider = "包名.fileprovider";
        PlatformConfig.setWeixin("微信AppId", "appkey");
        PlatformConfig.setWXFileProvider(FileProvider);

        PlatformConfig.setSinaWeibo("微博AppId", "appkey", "返回");
        PlatformConfig.setSinaFileProvider(FileProvider);
        PlatformConfig.setQQZone("QQ AppId", "appkey");
        PlatformConfig.setQQFileProvider(FileProvider);
    }
    
}

2、分享v7.1.7 SDK中的QQ SDK版本是v3.5.7,暂时只支持离线引入jar包和官方依赖库,并且需要调用授权api才可以正常使用授权和分享功能

//QQ官方sdk授权

Tencent.setIsPermissionGranted(true);

否则会报错:java.lang.Throwable: 错误码:2003 错误信息:分享失败----用户未授权,暂时无法使用QQ登录及分享等功能,

判断是否安装指定app

    public static boolean installApp(Context context, String package) {
        if (packageName == null || packageName.isEmpty()) {
            return false;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            //Android 11
            PackageInfo packageInfo;
            try {
                packageInfo = context.getPackageManager().getPackageInfo(packageName, 0);
            } catch (PackageManager.NameNotFoundException e) {
                packageInfo = null;
                e.printStackTrace();
            }
            return packageInfo != null;
        } else {
            final PackageManager packageManager = context.getPackageManager();
            List<PackageInfo> pInfo = packageManager.getInstalledPackages(0);
            if (pInfo != null) {
                for (int i = 0; i < pInfo.size(); i++) {
                    String pn = pInfo.get(i).packageName;
                    if (packageName.equals(pn)) {
                        return true;
                    }
                }
            }
            return false;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值