起因:

接入微信支付时,看到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​​中其他需要唯一的取值情况,这种使用方式很灵活。