android使用友盟实现第三方登录、分享以及微信回调无反应问题解决办法

  • Post author:
  • Post category:其他


这里介绍微信和新浪登录。微信登录和新浪登录都需要申请第三方账号。可以参考官方文档http://dev.umeng.com/social/android/operation#2还是很清晰的。

新浪微博开放平台http://open.weibo.com/有账号就可以,经常刷微博的小伙伴可以直接登录喽,注意修改安全域名同时确保授权回调页与代码中配置一致。

登录微信开放平台https://open.weixin.qq.com/官网, 审核通过后获取到微信AppID及AppSecret(注意保存好,平台不会再显示忘了需要重置),

需要微信登录功能,需要申请微信登录权限

获取微信登录权限需要收取一定费用,貌似300。一直没舍得,还好做项目的时候用到获得了,土豪随意
吐舌头


下面说代码实现

到友盟官网http://www.umeng.com/下载需要的SDK包。copy其中的jar包等到自己的项目中。


1、添加回调Activity

包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity。这里注意一定是包名路径下。同理新浪微博也需要一个回调的Activity,与微信不同的是它只需要在包名目录下建立一个名为WBShareActivity类即可,不用建立文件夹,该类继承WBShareCallBackActivity




2、权限及其他maifest中的配置

<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.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

相关Activity注册

新浪微博:(精简版不需要)以下方式注册若无法find请把包名写全。

 <activity
    android:name=".WBShareActivity"
    android:configChanges="keyboardHidden|orientation"
    android:screenOrientation="portrait" >
 <intent-filter>
 <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
 <category android:name="android.intent.category.DEFAULT" />
 </intent-filter>
 </activity>
 <activity
    android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
    android:configChanges="keyboardHidden|orientation"
    android:windowSoftInputMode="adjustResize"
    android:exported="false" >
 </activity>
 <service android:name="com.sina.weibo.sdk.net.DownloadService"
          android:exported="false"></service>

微信:

<activity
        android:name=".wxapi.WXEntryActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:exported="true"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" />

分享编辑页(只有新浪微博精简版,豆瓣人人腾讯微博需要):

 <activity
        android:name="com.umeng.socialize.editorpage.ShareActivity"
        android:theme="@style/Theme.UMDefault"
        android:excludeFromRecents="true"/>

友盟Appkey及相关第三方key配置

在AndroidManifest.xml中设置友盟Appkey

 
 <meta-data
            android:name="UMENG_APPKEY"
            android:value="561cae6ae0f55abd990035bf">
         </meta-data>


3、在项目的application类中配置第三方信息

    {
      // <!-- 微信平台 --> appid appsecret
      PlatformConfig.setWeixin("替换成自己appid","替换成自己的appsecret");
      // <!-- 新浪微博 --> appkey appsecret 
      PlatformConfig.setSinaWeibo("替换成自己appid","替换成自己的appsecret");
      Config.REDIRECT_URL = "新浪后台配置的回调地址";
      // <!-- QQQzone -->appid appkey
      PlatformConfig.setQQZone("替换成自己appid","替换成自己的appsecret");
   }

在application的oncreat方法中初始化

UMShareAPI.get(this);


4、登录实现

private UMShareAPI mShareAPI = null;
private SHARE_MEDIA platform = null;
mShareAPI = UMShareAPI.get(this);

点击事件:

case R.id.login_img_weibo:
    platform = SHARE_MEDIA.SINA;
    mShareAPI.doOauthVerify(LoginActivity.this, platform,
            umAuthListener);
    break;
case R.id.login_img_weixin:
    platform = SHARE_MEDIA.WEIXIN;
    mShareAPI.doOauthVerify(LoginActivity.this, platform,
            umAuthListener);
    break;

下面new

umAuthListener
private UMAuthListener umAuthListener = new UMAuthListener() {

    @Override
    public void onComplete(SHARE_MEDIA platform, int action,
                           Map<String, String> data) {
        if(platform == SHARE_MEDIA.WEIXIN){
           //unionid:(6.2以前用unionid)uid
           uid = data.get("unionid");
        }else{
            uid = data.get("uid");
        }
        if(!CheckUtils.isEmpty(uid)){
            //如果uid不为空即回调授权成功,则可以调接口告诉后台此时的第三方uid,后台判断此唯一标识值是否存在即判断用户是否用
            //第三方登录过,如果登录过直接进入主界面, 没有登录过则后台存储该值并进入注册界面进行手机号绑定注册
            judgeUMLogin();,如果登录
        }else{
            Toast.makeText(getApplicationContext(), "暂无法使用该登录方式",
                    Toast.LENGTH_SHORT).show();
        }
        Toast.makeText(getApplicationContext(), "授权成功",
                Toast.LENGTH_SHORT).show();
        Log.d("user info", "user info:" + data.toString());
    }

    @Override
    public void onError(SHARE_MEDIA platform, int action, Throwable t) {
        Toast.makeText(getApplicationContext(), "Authorize fail",
                Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancel(SHARE_MEDIA platform, int action) {
        Toast.makeText(getApplicationContext(), "Authorize cancel",
                Toast.LENGTH_SHORT).show();
    }
};


5、分享


回调相关配置

如果使用的是qq或者新浪精简版jar,需要在您使用分享或授权的Activity(fragment不行)中添加如下回调代码:

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

}


分享相关代码调用


打开分享面板

可以通过如下代码打开分享面板选择页

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

其中umShareListener为回调监听,相关分享结果都在回调监听中获取

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

private UMShareListener umShareListener = new UMShareListener() {
    @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();
    }
};


直接分享接口

对于需要不经过分享面板选择页,直接通过按钮实现某个平台的分享跳转操作的开发者,可以调用下面的代码实现

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

具体分享结果获取方法与使用分享面板相同,这里不再复述


登录不回调可能的情况:

1、WXEntryActivity

这个类的路径问题

2、微信官网的配置要求很严格

程序目录的包名必须与配置文件的包名还有微信开放平台配置的包名完全一致

。否则会出现回调无反应现象。(遇到过的)

3、微信未获取登录权限。(一般交钱审核通过就自动获取了登录权限)



版权声明:本文为qq_15855289原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。