起因:
接入微信支付时,看到AndroidManifest.xml中package声明为onetake,于是将WXPayEntryActivity放在了onetake包下。
结果无论如何都收不到调起支付后WXPayEntryActivity的onResp。
分析:
registerApp的Appid没写对,请求sendReq参数写错,或者是WXPayEntryActivity的位置出错。
排查:
我将微信官方SDK导入项目跑了一遍,把里面请求参数写成自己的假参数,发现仍然可以走到onResp并能调起页面。
Appid也没有问题。
最后分析是自己的 :包名.wxapi.WXPayEntryActivity 的问题。
我在手机设置里找到自己的应用程序,上面看到包名是nomo,不是ontake。
将包名改为ontake后,可以收到onResp回调。
结论:
尽管AndroidManifest.xml的package声明为onetake,但app的build.gradle里将applicationId写成了nomo,
在有applicationId的情况下,package的声明是无效的。(仅为个人理解)
以下为关于package和applicationId的关系:
1. 前言
- 本文资料来源网络公开资源,并根据个人实践见解纯手打整理,如有错误请随时指出。
- 本文主要用于个人积累及分享,文中可能引用其他技术大牛文章(仅引用链接不转载),如有侵权请告知必妥善处理。
2. applicationId
和packageName
2.1. IDE
为Eclipse
时
applicationId
基于gradle编译,Eclipse IDE
不存在applicationId
,也不能使用它,请忽略。
2.2. IDE
为Android Studio
时
2.2.1 applicationId
- 理论上来讲
applicationId
是android
设备以及google play
所公认的唯一标示。 - 若未配置
applicationId
时,google play
无法上线(据查) - 配置
applicationId
可以用作同一工程发布略有差异的不同apk
,比如收费版和免费版、代码相同标示不同的渠道包等。 -
配置方法(在
app
的build.gradle
中):-
一般配置
android { ...... defaultConfig { applicationId "sp.com.learncomposite" ...... } }
-
设置不同的
applicationId
配置
其中关于productFlavors
的应用可以参考这篇文章很详细:链接,或者参考官方文档:链接1,链接2。android { ...... productFlavors { pro { applicationId = "sp.com.learncomposite.pro" } free { applicationId = "sp.com.learncomposite.free" } } buildTypes { ...... debug { applicationIdSuffix ".debug" } } }
-
-
当
release
打包时,在签名界面,可以选择你将要打出的包,也可以多选并同时打出: -
当
debug
调试时,可以再Android studio
左下角的Build Variants
标签中选择当前调试的是哪个包:
2.2.2 packageName
- 将仅被代码(如资源文件
R.java
)或Manifest
清单中声明(如类的包路径和packageName
相同时,activity
的name
缩写为”.xxxActivity
“)使用。
2.2.3 两者纠缠的关系
- 当
applicationId
不存在时,applicationId
将默认为packageName
。 - 当
applicationId
存在时,packageName
仅有其本身的功能,而applicationId
将作为唯一标示。
3. 在Manifest
中使用${applicationId}
-
如
Provider
在声明android:authorities
(该值必须唯一)时,如前缀为写死的包名字符串,当出现需要同一工程分包、分渠道打包时,安装在同一android
设备将导致INSTALL FAILED CONFLICTING PROVIDER
的报错(使用adb
安装会有提示),这时可以使用${applicationId}
,这将避免android:authorities
值非唯一的问题。<provider android:name="xxxx.xxxx.xxx.xxxProvider" android:authorities="${applicationId}.xxxx" android:grantUriPermissions="true" android:exported="false"/>
-
${applicationId}
也可以用在Manifest
中其他需要唯一的取值情况,这种使用方式很灵活。