友盟+搜索

{{errorMsg}}

登录

登录流程

Demo 和 SDK 的默认的登录以及(首次)登录后的跳转逻辑:

img

下列方案,推荐带有『跳转逻辑』的方案一,方便用户首次进入有内容可看,并能够形成『关注』的关系链。

登录方案一(有跳转逻辑)

AbsLoginImpl注入方式。首先你需要实现并继承AbsLoginImpl类,实现onLogin方法,然后将登录实现注入到SDK内部即可。

public class XXXLoginImpl extends AbsLoginImpl {
    @Override
    protected void onLogin(Context context, LoginListener listener) {
        // 注意用户id、昵称、source是必填项
        CommUser loginedUser = new CommUser("用户id"); // 用户id
        loginedUser.name = "用户昵称"; // 用户昵称
        loginedUser.source = Source.SINA;// 登录系统来源,支持当前流行的第三方平台,如果是自有账号系统或者不在Source范围内,可不传此参数

        loginedUser.gender = Gender.FEMALE;// 用户性别
        loginedUser.level = 1; // 用户等级,非必须字段
        loginedUser.score = 0;// 积分,非必须字段
        // 登录完成回调给社区SDK,200代表登录成功
        listener.onComplete(200, loginedUser);
    }
}

然后实现注入登录:

    // 确保不要重复注入同一类型的对象,建议放在Application类的onCreate函数执行
    LoginSDKManager.getInstance().addAndUse(new XXXLoginImpl());

注意 : 如果您需要在退出登录时处理相关逻辑,您可以覆盖onLogout方法来实现。

注意 : 此方案下,首次登录之后默认会有弹出『修改社区账户资料』,『话题推荐』,『用户推荐』的界面,如果需要修改这些默认策略,需要自己实现AbsLoginResultStrategy类中的onLoginResult方法,然后在CommConfig.setLoginResultStrategy设置

登录方案二(无跳转逻辑)

自己实现单纯的登录逻辑(如果你自己的 APP 有一个登录页面,登录完成之后要想实现用户登录到微社区),只需要实现下面的代码,不推荐:

方法1,通过第三方平台账号登录

    //创建CommUser前必须先初始化CommunitySDK
    CommunitySDK sdk = CommunityFactory.getCommSDK(this);
    CommUser user = new CommUser();
    user.name = "UserName";
    user.id = "你的用户ID";
    user.source = Source.SINA;
    sdk.loginToUmengServer(this, user, new LoginListener() {
        @Override
        public void onStart() {

        }

        @Override
        public void onComplete(int stCode, CommUser commUser) {
            Log.d("tag", "login result is"+i);          //获取登录结果状态码
            if (ErrorCode.NO_ERROR==stCode) {
                //在此处可以跳转到任何一个你想要的activity
            }

       }
    });

方法2,通过自由账号系统或其他账号系统登录

    //创建CommUser前必须先初始化CommunitySDK
    CommunitySDK sdk = CommunityFactory.getCommSDK(this);
    CommUser user = new CommUser();
    user.name = "UserName";
    user.id = "你的用户ID";
    sdk.loginToUmengServerBySelfAccount(this, user, new LoginListener() {
        @Override
        public void onStart() {

        }

        @Override
        public void onComplete(int stCode, CommUser commUser) {
            Log.d("tag", "login result is"+i);          //获取登录结果状态码
            if (ErrorCode.NO_ERROR==stCode) {
                //在此处可以跳转到任何一个你想要的activity
            }

       }
    });

提示

//登录成功后可以用该方法判断用户时候已经登录
CommonUtils.isLogin(context);

配置 QQ 和 微信

微社区默认使用了社会化组件来实现登录和分享功能,具体平台配置可以参考友盟社会化组件登录,以下只列出 QQ 和微信的配置:

配置 QQ 平台

1.在QQ开放平台申请移动应用,获取Appid跟AppKey;
2.在AndroidManifest.xml中添加如下配置,并且设置你的QQ平台appid;

<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" />
        <!--  配置QQ登录所需的Appid -->
        <data android:scheme="tencent+你的QQ互联APPID" />
    </intent-filter>
</activity>
<activity           
    android:name="com.tencent.connect.common.AssistActivity"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" >
</activity>

3.在代码中调用如下代码添加对QQ登录的支持。

String appId = "你的qq appid";
String appKey = "你的qq appkey";
new UMQQSsoHandler(this, appId, appKey).addToSocialSDK();

配置微信登录

  1. 在微信开放平台申请应用并申请授权权限,获取Appid跟AppSecret(申请时应注意填写正确的包名跟签名,否则无法登录);
  2. 将压缩包中login目录中wxapi目录拷入您的工程的包目录下,确保拷贝后WXEntryActivity.java的完整路径为:您的包名.wxapi.WXEntryActivity.java;
  3. 在AndroidManifest.xml中添加如下配置;
<activity
    android:name=".wxapi.WXEntryActivity"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:exported="true"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />

4.调用如下代码添加对微信登录的支持.

String appid = "xxxx";
String appSecret = "xxx"
new UMWXHandler(activity, appid, appSecret).addToSocialSDK();

定制用户名的规则

用户注册(第一次登录)时,我们默认会有长度2~20,以及一些非法字符的限制,如果需要放宽这些限制,可以修改CommConfig.mRule(USERNAME_RULE)和CommConfig.mUserNameLenRule(USERNAME_LEN_RULE)两个变量来满足需求

Fragment方式集成

1.在Activity初始化的时候,初始化社区SDK:

CommunitySDK mCommSDK = CommunityFactory.getCommSDK(YourContext);
// 初始化sdk,请传递ApplicationContext
mCommSDK.initSDK(YourContext);

2.微社区支持以Fragment的方式集成到您的App中,只需要以下简单的简单的几行代码即可完成。如下:

CommunityMainFragment mFeedsFragment = new CommunityMainFragment();
//设置Feed流页面的返回按钮不可见
mFeedsFragment.setBackButtonVisibility(View.INVISIBLE);
//添加并显示Fragment
getSupportFragmentManager().beginTransaction().add(R.id.container, mFeedsFragment).commit();

3.在AndroidManifest.xml中,将你显示社区fragment的Activity配置以下属性:

android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="stateHidden|adjustResize"

如果您的Activity含有多个Fragment,请注意一下几点:
a)CommunityMainFragment的重用。CommunityMainFragment相对较重量级,重新实例化将花费较多的时间。
b)CommunityMainFragment采用Fragment+ViewPager的方式实现,如果你的项目也是采用ViewPager的方式集成微社区CommunityMainFragment,请将您的ViewPager替换成CommunityViewPager(继承ViewPager,处理了ViewPager嵌套ViewPager导致滑动事件冲突的问题)。
c)在微社区内部退出登录后,你需要根据自己的产品需求决定后续操作,比如退出登陆后跳转到微社区feed流页面等。你可以通过下面2种方式来指定退出登录后的操作:

  • 你可以继承AbsInnerLogoutStrategy来自定义。AbsInnerLogoutStrategy主要完成的功能为:跳转到显示MainFeedsFragment的activity。你需要实现setupIntent方法,完成某些操作(清理Activity任务栈,存放某些参数)。然后调用CommConfig.getConfig().setInnerLogoutStrategy(...)将你的策略注入到我们sdk内部。
  • 如果上面的策略不能满足您的需求,你可以实现InnerLogoutStrategy接口,完成你的业务逻辑,然后调用CommConfig.getConfig().setInnerLogoutStrategy(...)将你的策略注入到我们sdk内部。

我们内置了一套默认实现。默认实现的策略为:清理整个Activity任务栈 --> 在intent中存放from_community_logout-true(键值对) --> 跳转到你显示MainFeedsFragment的activity。如果此时你期望在退出微社区后跳转到feed流页面,你仅仅需要在Activity的onResume方法中检测from_community_logout的值是否为true,如果为真则显示MainFeedsFragment。注意:**此时需要在AndroidManifest.xml中将你的Activity配置为android:launchMode="singleTask"**。

4.在你的Activity中覆盖onNewIntent方法。由于在singleTask情况下,重新启动已经存在的Activity时,你intent中的参数不会被保存并传递回来,因此需要覆盖其默认行为。如下

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);     
    setIntent(intent);
}

5.由于在横竖屏切换的时候,其系统渲染可能出现问题,因此我们建议您将自己的Activity设置为横屏或者竖屏.可通过xml或者代码设置横竖屏。
xml方式配置。在AndroidManifest.xml中对应的Activity中添加如下配置:

//竖屏
android:screenOrientation="portrait"
//横屏
//android:screenOrientation="landscape"

代码方式设置:

//横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//竖屏      
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

注意:如果在代码中设置横竖屏,需要放在activity的onCreate方法的最前面。如下:

protected void onCreate(Bundle savedInstanceState) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    super.onCreate(savedInstanceState);
}

消息推送

在微社区后台-设置模块中,设置Push调整的Actiivty,如果下图所示

1 如果是使用SDK中的Ui,默认配置即可
2 如果是自定义的UI界面,则需要替换成自己的Actiivty

|

图片相关

使用已有的图片加载器

如果你已经有自己的图片加载组件,可以直接在微社区中使用自己的图片加载组件。经过简单的两步即可集成自己的图片加载组件,详细步骤如下:
1.新建一个类XXXImageLoaderImpl并实现接口类UMImageLoader,实现displayImage(显示图片)、resume(重新执行图片加载调度)、pause(暂停图片调度)、reset(重新图片调度)方法。 如下:

public class XXXImageLoaderImpl implements UMImageLoader {

    @Override
    public void displayImage(String urlOrPath, ImageView imageView) {
        this.displayImage(urlOrPath, imageView, null);
    }

    @Override
    public void displayImage(final String urlOrPath, final ImageView imageView,
            final ImgDisplayOption option) {
        //加载图片并设置给imageView
    }

    @Override
    public void resume() {
        //重新启动图片加载
    }

    @Override
    public void pause() {
        //暂停图片加载。在滑动的时候,暂停图片加载
    }

    @Override
    public void reset() {
        //重置图片加载器
    }
}

2.调用如下代码,将自己的图片加载器注入到SDK中

ImageLoaderManager.getInstance().addAndUse(new XXXImageLoaderImpl());               

使用自己的图片选择器

在Feed发布页面,用户默认最多可以选择9章图片,而选择图片的组件也可以通过上述自定义子系统的形式替换。这个图片选择的接口就是ImagePicker,用户实现该接口中的两个函数即可,示例如下 :

// 默认的图片选择器
public class CustomImagePicker implements ImagePicker {

    // 跳转到图片选择的Activity
    @Override
    public void jumpToPickImagesPage(Activity activity, ArrayList<String> selected) {
        Intent intent = new Intent(activity, YourImagePickerActivity.class);
        intent.putExtra(PhotoSelectorActivity.KEY_MAX, 9);
        // 传递已经选中的图片
        intent.putStringArrayListExtra(Constants.PICKED_IMAGES, selected);
        intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        activity.startActivityForResult(intent, Constants.PICK_IMAGE_REQ_CODE);        
    }

    // 解析从图片选择Activity返回的数据
    @SuppressWarnings("unchecked")
    @Override
    public List<String> parsePickedImageList(Intent intent) {
        return  intent.getStringArrayListExtra(Constants.FEED_IMAGES);
    }
}

在你的图片选择Activity中,当用户确定选中的图片时,会将结果存储在Intent中,并且返回,示例如下 :

public class YourImagePickerActivity extends Activity {

    // 代码省略

    private void pickedImageDone() {
        if (mSelectedPhotos.isEmpty()) {
            setResult(RESULT_CANCELED);
        } else {
            Intent data = new Intent();
            Bundle bundle = new Bundle();
            // 这个类型是ArrayList<Stirng>类型的,存储了已选中的图片URI
            bundle.putSerializable(Constants.FEED_IMAGES, mSelectedPhotos);
            data.putExtras(bundle);
            // 返回数据
            setResult(RESULT_OK, data);
        }
        finish();
    }
}

在YourImagePickerActivity中将选中的图片URI列表返回,我们会在PostFeedActivity的onActivityResult函数中对这些数据进行处理。

最后将你的图片选择器对象注入到ImagePickerManager中,代码如下 :

ImagePickerManager.getInstance().addAndUse(new CustomImagePicker());

至此,自定义图片选择器的流程就已经完成。

其他配置

字体配置

字体文件lantinghei-font.TTF可以删除

双#号配置

可以通过Constants.TOPIC_GAT来设定,默认为"#"号。


如果您在使用友盟微社区产品上有什么问题,请发邮件至**wsq-support@umeng.com**,我们会尽快跟进您的问题。