android应用安装成功的回调,android app使用微信登录接口回调没有被执行的问题研究...

本人开发的一个app使用了sharesdk集成微信登录功能,在测试的过程中微信授权登录界面有调用,但是授权后原应用的回调没有被执行

应用的包名是com.kimi.searcher

首先,确认微信点击授权后有没有执行回调,方法是通过日志过滤activitymanager,

日志中有出现

04-16 13:27:43.345 1805-3279/? I/ActivityManager: START u0 {flg=0x18000000 cmp=com.kimi.searcher/.wxapi.WXEntryActivity (has extras)} from uid 10156 on display 0

说明微信有回调app的wxentryactivity

那么继续判断安装包中的WXEntryActivity是否存在

使用https://github.com/iBotPeaches/Apktool 来反编译apk安装包,发现安装包中不存在com.kimi.searcher.wxapi.WXEntryActivity.取而代之的是com.qq.rnsharesdk.wxapi.WXEntryActivity.

原因分析:com.qq.rnsharesdk.wxapi.WXEntryActivity是放在一个依赖项目中的微信入口activity.被依赖的项目的package是com.qq.rnsharesdk。 activity的名称是.wxapi.WXEntryActivity。 原来gradle 在编程的过程中,androidmanifest.xml中的相对路径组件会根据被依赖包中的package名来生成全路径名称,而不是app项目中的package来生成全路径名称。

于是我在app项目中添加一条activity, 并且把build.gradle中的applicationId改成了com.kimi.searcher。编译后发现回调依然没有被执行,把新包进行反编译,发现androidmanifest.xml中多了一条com.awesomeproject.wxapi.WXEntryActivity。

原因是androidmanfiest.xml的相对路径填充不会使用build.gradle中使用的applicationId,而会使用androidmanifest.xml中的package来进行路径填充。

与往常使用gradlew编译安卓项目,build.gradlew的配置会覆盖androidmanifest.xml的配置的经验不同,androidmanifest.xml的相对路径填充的规则:

1.使用最近的package配置,2.不使用build.gradle中的配置

Android 微信授权登录、获取Wx用户信息,解决无法回调问题

微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。

据此记载..(坑)

1.微信注册应用平台的应用签名为 打包keystore的MD5 小写并且去掉 ":" 号组成、或者去下载 微信签名生成工具 输入项目的packageName也可以查看到。

2.授权没反应,监测微信App_Id是否正确、是否按照上1.生成。 当前的App是否正式签名?也就是正式App.. DeBug签名环境的App貌似无法调动微信。

3.关于回调:是否按照官方要求注册WXEntryActivity并且继承Acticiy、 此Activity不能改名,并且在你的 package(项目报名).wxapi.WXEntryActivity.java 下面。 注册* 每段代码都别少...

android:name=".wxapi.WXEntryActivity"

android:exported="true"

android:label="@string/app_name"

android:launchMode="singleTop"

android:theme="@android:style/Theme.Translucent" />

4.回调方法onResp() 方法没有触发回调、请监测WXEntryActivity onCreate中是否调用此方法  mApi.handleIntent(this.getIntent(), this);

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

private final String TAG = this.getClass().getSimpleName();

public static final String APP_ID= "请自己填写";

public static final String APP_SECRET= "请自己填写";

private IWXAPI mApi;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mApi = WXAPIFactory.createWXAPI(this, APP_ID, true);

mApi.handleIntent(this.getIntent(), this);

}

//微信发送的请求将回调到onReq方法

@Override

public void onReq(BaseReq baseReq) {

}

//发送到微信请求的响应结果

@Override

public void onResp(BaseResp resp) {

switch (resp.errCode) {

case BaseResp.ErrCode.ERR_OK:

//发送成功

break;

case BaseResp.ErrCode.ERR_USER_CANCEL:

//发送取消

break;

case BaseResp.ErrCode.ERR_AUTH_DENIED:

//发送被拒绝

break;

default:

//发送返回

break;

}

finish();

}

}

5.当授权时候进入WXEntryActivity、当前背景可能是黒或白,为了不影响用户体验,可以把当前Activity设置为透明。android:theme="@android:style/Theme.Translucent" ,可以参照上3. WXEntryActivity注册格式。

以上便是授权登录遇到的坑、只怪Wx要求格式的有个性、多多少少会遇到这样的坑。

wronged.gif

授权登录并且拿取Wx用户信息,简单三部曲:

** 1.sendReq(req). 用户授权可以拿到 code** 2.用code.调用Wx接口拿到 openid & accessToken** 3.通过openid & accessToken 俩参数可以拿到最终用户信息**

部分代码:

/*** 获取openid accessToken值用于后期操作**@paramcode请求码*/private void getAccess_token(final String code) {

new Thread(new Runnable() {

@Override

public void run() {

String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="

+ APP_ID+ "&secret="

+ APP_SECRET+ "&code="

+ code

+ "&grant_type=authorization_code";

try {

JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 请求https连接并得到json结果

if (null != jsonObject) {

String openid = jsonObject.getString("openid").toString().trim();

String access_token = jsonObject.getString("access_token").toString().trim();

getUserMesg(access_token, openid);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}).start();

}

/*** 获取微信的个人信息**@paramaccess_token*@paramopenid*/private void getUserMesg(final String access_token, final String openid) {

String path = "https://api.weixin.qq.com/sns/userinfo?access_token="

+ access_token

+ "&openid="

+ openid;

try {

JSONObject jsonObject = JsonUtils.initSSLWithHttpClinet(path);// 请求https连接并得到json结果

if (null != jsonObject) {

String nickname = jsonObject.getString("nickname");

int sex = Integer.parseInt(jsonObject.get("sex").toString());

String headimgurl = jsonObject.getString("headimgurl");

Log.e(TAG, "getUserMesg 拿到了用户Wx基本信息.. nickname:" + nickname);

}

} catch (Exception e) {

e.printStackTrace();

}

return;

}

参考、感谢:

框架内部支持中/英文(其他语言只需要在对应的string.xml中取相同的名字即可)内部对话框背景图片、按钮支持自定义了查看版本中的Log只需要过滤AppUpdate开头的Tag重点: 如果没有设置downloadPath则默认为getExternalCacheDir()目录,同不会申请[存储]权限!目录编译问题效果图功能介绍DownloadManagerUpdateConfiguration使用步骤Demo下载体验版本更新记录结语编译问题因为适配了Android O的通知栏,所以依赖的v7包版本比较高appcompat-v7:26.1.0使用的gradle版本为gradle-4.1-all,所以建议使用Android Studio 3.0及以上的版本打开此项目效果图     功能介绍 支持断点下载 支持后台下载 支持自定义下载过程 支持 设备 >= Android M 动态权限的申请 支持通知栏进度条展示(或者自定义显示进度) 支持Android N 支持Android O 支持中/英文双语 支持自定内置对话框的样式 使用HttpURLConnection下载,未集成其他第三方框架更加详细的文档参阅此处《AppUpdate API文档》DownloadManager:配置文档初始化使用DownloadManager.getInstance(this)属性描述默认值是否必须设置context上下文nulltrueapkUrlapk的下载地址nulltrueapkNameapk下载好的名字nulltruedownloadPathapk下载的位置getExternalCacheDir()falseshowNewerToast是否提示用户 "当前已是最新版本"falsefalsesmallIcon通知栏的图标(资源id)-1trueconfiguration这个库的额外配置nullfalseapkVersionCode更新apk的versionCode (如果设置了那么库中将会进行版本判断下面的属性也就需要设置了)1falseapkVersionName更新apk的versionNamenullfalseapkDescription更新描述nullfalseapkSize新版本的安装包大小(单位M)nullfalseauthorities兼容Android N uri授权应用包名falseUpdateConfiguration:配置文档属性描述默认值notifyId通知栏消息id1011notificationChannel适配Android O的渠道通知详情查阅源码httpManager设置自己的下载过程nullbreakpointDownload是否需要支持断点下载trueenableLog是否需要日志输出trueonDownloadListener下载过程的回调nulljumpInstallPage下载完成是否自动弹出安装页面trueshowNotification是否显示通知栏进度(后台下载提示)trueforcedUpgrade是否强制升级falseonButtonClickListener按钮点击事件回调nulldialogImage对话框背景图片资源(图片规范参考demo)-1dialogButtonColor对话框按钮的颜色-1dialogButtonTextColor对话框按钮的文字颜色-1所有版本:点击查看使用步骤第一步: app/build.gradle进行依赖implementation 'com.azhon:appupdate:1.7.3'第二步:创建DownloadManager,更多用法请查看这里示例代码DownloadManager manager = DownloadManager.getInstance(this); manager.setApkName("appupdate.apk")         .setApkUrl("https://raw.githubusercontent.com/azhon/AppUpdate/master/apk/appupdate.apk")         .setSmallIcon(R.mipmap.ic_launcher)         //可设置,可不设置         .setConfiguration(configuration)         .download();第三步:兼容Android N 及以上版本,在你应用的Manifest.xml添加如下代码<--! android:authorities="${applicationId}"  这个值必须与DownloadManager中的authorities一致(不设置则为应用包名)--> <provider     android:name="android.support.v4.content.FileProvider"     android:authorities="${applicationId}"     android:exported="false"     android:grantUriPermissions="true">     <meta-data         android:name="android.support.FILE_PROVIDER_PATHS"         android:resource="@xml/file_paths_public" /> </provider>第四步:资源文件res/xml/file_paths_public.xml内容<?xml version="1.0" encoding="utf-8"?> <paths>     <external-path         name="app_update_external"         path="/" />     <external-cache-path         name="app_update_cache"         path="/" /> </paths>兼容Android O及以上版本,需要设置NotificationChannel(通知渠道);库中已经写好可以前往查阅NotificationUtil.java温馨提示:升级对话框中的内容是可以上下滑动的哦!如果需要实现自己一套下载过程,只需要继承BaseHttpDownloadManager 并使用listener更新进度public class MyDownload extends BaseHttpDownloadManager {}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值