最近做项目用到了分享功能,介于友盟的全家桶,于是放弃shareSDK,选择友盟,虽然是完全按照友盟集成文档来做的,但是总是有些不顺畅,不能一下就搞定,这里记录一下过程,与遇到的坑
1.项目准备工作
a.到http://dev.umeng.com/social/android/sdk-download下载安卓版sdk,这里我选择了微信,QQ,与微博的精简版
b.新建一个项目,这里我选择应用的包名以及签名都与友盟分享的demo一样,目的就是为了使用他的签名和它在各大平台注册的APPid与appkey,
当然自己的项目要有分享功能的时候一定要自己到各大开放平台去注册申请,qq分享集成很简单,可以直接拿别人的appid来做,但是微信跟微博就不行,必须要用自己的项目appid以及签名,所以这就是为何我建项目跟友盟demo一样的原因,建好项目后,将下载下来的lib与res文件都加入到项目对应的文件夹下,并且确保引用了这些jar文件,项目结构如下
c.将debug.keystore文件加入到build.gradle同级,目的是为了使用友盟的签名,完成后
build.gradle应该是这样
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.umeng.soexample"
minSdkVersion 19
targetSdkVersion 22
}
buildTypes {
release {
// 是否进行混淆
minifyEnabled true
// 混淆文件的位置
// signingConfig signingConfigs.debug
proguardFiles 'proguard-rules.pro'
}
debug {
minifyEnabled true
//signingConfig signingConfigs.debug
proguardFiles 'proguard-rules.pro'
}
}
/*加上这段代码是为了直接运行可以用正式的签名,所以在自己的项目中如果是直接用正式签名可以删除
不用真是签名微博与微信是无法正常运行的,这个demo是友盟分享demo的简化版,只有微信,qq,微博
三个平台,在项目中一定要确定自己的项目包名签名与各个平台申请的app是相对应的*/
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}
lintOptions {
abortOnError false
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:23.2.1'
testCompile 'junit:junit:4.12'
compile files('libs/SocialSDK_QQZone_3.jar')
compile files('libs/SocialSDK_umengqq.jar')
compile files('libs/SocialSDK_umengsina.jar')
compile files('libs/SocialSDK_umengwx.jar')
compile files('libs/SocialSDK_WeiXin_2.jar')
compile files('libs/umeng_social_api.jar')
compile files('libs/umeng_social_net.jar')
compile files('libs/umeng_social_view.jar')
}
d.在项目包名中添加wxapi文件夹,将WXEntryActivity,添加进去,注意
WXEntryActivity路径一定要是
mainfest中的包名,如果项目java文件夹与
mainfest的包名不一致,请建立一个
mainfest的包名.
wxapi为准的文件夹,并且将
WXEntryActivity放进去
<span style="font-size:10px;">package com.umeng.soexample.wxapi; import com.umeng.socialize.weixin.view.WXCallbackActivity; public class WXEntryActivity extends WXCallbackActivity { }</span>
e.在mainfest中添加activity
<span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.umeng.soexample" >
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- renren sso Permission for Unit Test -->
<!-- QQ、QQ空间所需权限 -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.SET_DEBUG_APP" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<application
android:name="com.umeng.soexample.App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--微信-->
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!--qq-->
<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" />
<!--这里的scheme是qq分享要用的,根据自己申请的appid=100424468,可以写成如下格式,
appid与自己应用不一致的话,会导致分享成功成功,但是返回后提示分享取消了,不会走分享成功的回调方法-->
<data android:scheme="tencent100424468" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize"/>
<!--分享编辑页-->
<activity
android:name="com.umeng.socialize.editorpage.ShareActivity"
android:theme="@style/Theme.UMDefault"
android:excludeFromRecents="true"
/>
<meta-data
android:name="UMENG_APPKEY"
android:value="561cae6ae0f55abd990035bf" >
</meta-data>
</application>
</manifest></span>
2.项目代码
a.mainactivity.java
package com.umeng.soexample;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.UMShareListener;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.shareboard.SnsPlatform;
import com.umeng.socialize.utils.Log;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
public ArrayList<SnsPlatform> platforms = new ArrayList<SnsPlatform>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private UMShareListener umShareListener = new UMShareListener() {
@Override
public void onResult(SHARE_MEDIA platform) {
Log.d("plat","platform"+platform);
if(platform.name().equals("WEIXIN_FAVORITE")){
Toast.makeText(MainActivity.this,platform + " 收藏成功啦",Toast.LENGTH_SHORT).show();
}else{
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();
}
};
public void click(View view) {
new ShareAction(MainActivity.this).setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN,SHARE_MEDIA.WEIXIN_CIRCLE)
.withTitle(Defaultcontent.title)
.withText(Defaultcontent.text+"——来自友盟分享面板")
.withMedia(new UMImage(MainActivity.this, Defaultcontent.imageurl))
.withTargetUrl("https://wsq.umeng.com/")
.setCallback(umShareListener)
.open();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
/** attention to this below ,must add this**/
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
Log.d("result","onActivityResult");
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="自定义面面板分享"/>
</RelativeLayout>
b,运行效果
3.注意事项
a.如果项目中出现微信闪退,原因可能是,自己的appid与签名不正确问题(微信app默认是开启分享功能的,而支付需要再次申请)
b.微博出现文件不存在c8998错误,可以去微博开放平台检查是否申请该项目的分享功能,并且确认
Config.REDIRECT_URL="http://sns.whalecloud.com/sina2/callback";//需要替换成自己的回调地址
这个url与自己的app的回调地址相同,获取这个地址的方式可以自己百度下
c.qq提示应用不存在的错误,可以去腾讯开放平台查看下,是否申请了分享功能
Demo地址: 点击打开链接