本书提供了所有章节的完整源码下载,自上市以来陆续收到读者的意见反馈,现将与源码有关的问题汇总归类如下,方便更多的朋友解决源码运行过程中发现的问题: 一、打开本书源码时,出现“Plugin with id 'com.android.application' not found.”的错误。 问题原因:本书源码以module形式提供,所以不能当作工程打开,而要以模块的形式来导入。 解决办法: 按以下步骤重新导入本书源码: 1、依次选择菜单“File”——“New”——“New Project”,按提示新建一个项目(即Project);
2、项目创建完毕,再依次选择菜单“File”——“New”——“Import Module”,按提示导入具体的demo;
注意要出现Project级别的build.gradle才可以正常编译。 二、导入源码之后,编译提示“Fail to find Build Tools revision 25.0.2”,如下图所示:
问题原因:因为本书源码里面的build.gradle里面的buildToolsVersion取值为25.0.2,所以as提示要用这个版本的编译工具来编译。 解决办法:有下面两个办法: 1、单击错误文字下面的链接“Install Build Tools 25.0.2 and sync project”,按提示下载并安装该版本的编译工具。 2、如果不想安装Build Tools 25.0.2,也可自行修改build.gradle,把buildToolsVersion取值改为你电脑上的编译工具版本号。 三、导入部分模块提示filedialog找不到,错误描述为“Project with path ':filedialog' could not be found in root project 'media'”。 问题原因:第十章的network_client、第十一章的event、第十三章的media这几个模块的压缩包里额外多了filedialog目录,这是因为filedialog是个文件对话框库,network_client、event、media这三个模块依赖于filedialog模块。 解决办法: 对于network、event、media这几个模块,要先按模块方式导入filedialog,然后再导入自身模块。 四、部分手机上无法正常显示购物车图片。 问题原因:Android7.0级以上手机默认不分配sd卡存储权限导致的。即使你在设置中开启存储权限,重启app也看不到购物车商品图片,这是因为代码有判断SharedPreferences保存的first数值,如果不是首次运行则不进行图片加载操作。 解决办法: 修改storage模块中ShoppingCartActivity.java的downloadGoods方法,把下面这行代码:
代码语言:javascript复制 String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) "/";
改为下面这段代码:
代码语言:javascript复制 String path = "";
//Android7.0之后默认关闭App的SD卡权限,所以对于7.0以上系统把存储路径改为App安装路径的data目录下
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) "/";
} else {
path = MainApplication.getInstance().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() "/";
}
然后在手机上卸载并重装storage。 购物车功能涉及到第四章的storage模块和第五章的senior模块,另外其它几章有涉及到SD卡操作的地方也要加以注意。 五、network_server.rar里面的几个工程无法用Android Studio打开。 问题原因:该压缩包里的是服务端工程,需要使用Eclipse打开。 解决办法: 到 http://www.eclipse.org/downloads/packages/release/Oxygen/1A 下载Java EE版本的Eclipse,安装完成后再导入network_server.rar的几个工程。 这个网络通信服务端的代码适用于本书的以下章节: 1、“10.4.2 Socket通信”章节,Socket服务端的源码见本书附录Socket工程的TestServer.java 2、“10.5 实战项目:仿手机QQ的聊天功能”章节,服务器方面要实现三个后台功能,分别是: 2.1. 文件上传功能,源码参见本书附录UploadTest工程里面的UploadServlet.java 2.2. 获取好友列表接口,源码参见本书附录UploadTest工程里面的QueryFriend.java 2.3. Socket服务器,源码参见本书附录Socket工程,主程序入口在ChatServer.java 六、成功运行仿QQ聊天的App,发现好友列表页面出现乱码。 问题原因:network_server.rar里面的工程代码采用了UTF-8编码,而开发者电脑上的Eclipse默认是GBK编码,编码方式不一致就导致乱码了。 解决办法: 通过以下步骤把Eclipse的文件编码由GBK改为UTF-8,依次选择菜单“Window”——“Preferences”——“General”——“Workspace”,在窗口下方找到“Text file encoding”,把编码方式改为“Other”——“UTF-8”,如下图所示:
七、部分手机使用DownloadManager下载图片会闪退。 问题原因:Android7.0之后增强了文件访问权限,DownloadManager.COLUMN_LOCAL_FILENAME被废弃,如果在7.0及以上手机访问该字段会触发异常java.lang.SecurityException。 解决办法: 改为使用Uri方式访问文件,即把COLUMN_LOCAL_FILENAME改为COLUMN_LOCAL_URI,具体到代码里则是将下面这行代码
代码语言:javascript复制 int nameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
改为下面这行代码:
代码语言:javascript复制 int nameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
注意network模块的DownloadImageActivity.java和ChatMainActivity.java里的相关代码都要修改。 八、network模块的“http获取图片”按钮进去之后显示不了图片 demo里面的图片地址已失效,需要改成新地址,也就是把GetImageCodeTask.java里面的下面一行代码
代码语言:javascript复制 private String mImageCodeUrl = "http://220.160.54.47:82/JSPORTLET/radomImage?x=";
改成下面这行代码:
代码语言:javascript复制 private String mImageCodeUrl = "http://222.77.181.14/ValidateCode.aspx?r=";
另外,“下载apk安装包”进去如果发现有的安装包无法下载,那是因为安装包的下载地址已经失效,需要修改DownloadApkActivity.java里面的下载链接。 九、导入mixture模块提示不存在WebScriptActivity 问题原因:当时为了精简本书删了一部分内容,demo的相关代码也删了,AndroidManifest.xml的WebScriptActivity漏了删。 解决办法:把AndroidManifest.xml里的下面这行删除即可
代码语言:javascript复制 <activity android:name=".WebScriptActivity" />
十、jni编译的so库无法在部分手机上正常使用。 问题原因:Android6.0之后,App如果通过jni接口调用了so库,则这个so库必须把相关库编译进去,因为系统将不允许App访问系统库。倘若在build.gradle的defaultConfig节点下补充ndk的编译说明,则编译出来的so文件无法在Android6.0上正常调用。 解决办法: 在build.gradle中采用externalNativeBuild方式编译jni工程,即在jni目录下提供专门的Android.mk编译文件,由该mk文件配置jni文件的编译规则。externalNativeBuild的配置例子如下所示:
代码语言:javascript复制 externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
}
十一、Android.mk内部只能使用绝对路径,不能使用相对路径。 问题原因:原来的Android.mk是带BOM格式,所以编译会出状况,需要另存为不带BOM的才可以正常使用相对路径。 解决办法: 到 https://pan.baidu.com/s/1hsu2i2K 下载最新的jni源码,并覆盖到mixture模块的jni目录。 十二、在部分手机上无法查看已连接的蓝牙设备。 问题原因:Android6.0之后对蓝牙功能的校验也变严格了,即使已经在AndroidManifest.xml声明蓝牙的相关权限如BLUETOOTH_ADMIN和BLUETOOTH,App也不能正常检测到附近的蓝牙设备。 解决办法: 在AndroidManifest.xml中增加下面两个权限声明:
代码语言:javascript复制<!-- Android6.0 蓝牙搜索不到设备,需要补充下面两个权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
十九、补充几个在Android Studio 3.0上面使用API27(Android8.1)编译时发现的问题解决办法: 1、编译group模块提示下面的编译错误:
代码语言:javascript复制Error:(65, 11) Error: Expected resource of type id [ResourceType]
public void onClick(View v) {
~~
groupsrcmainjavacomexamplegroupadapterLinearDynamicAdapter.java:66: Error: Expected resource of type id [ResourceType]
int position = getPosition(v.getId()/10);
~~
groupsrcmainjavacomexamplegroupadapterLinearDynamicAdapter.java:79: Error: Expected resource of type id [ResourceType]
解决办法: 把v.getId()的类型强制转换为int型,即将“v.getId()”改为“(int)v.getId()”。 2、编译mixture模块提示下面的编译错误:
代码语言:javascript复制Error:Execution failed for task ':mixture:transformNativeLibsWithMergeJniLibsForRelease'.
> More than one file was found with OS independent path 'lib/armeabi/libjni_mix.so'
解决办法: 在mixture模块的build.gradle文件中增加下面的编译配置:
代码语言:javascript复制 packagingOptions {
pickFirst 'lib/armeabi/libjni_mix.so'
}
修改后的android节点示例如下:
代码语言:javascript复制android {
compileSdkVersion 27
buildToolsVersion "27.0.1"
defaultConfig {
applicationId "com.example.mixture"
minSdkVersion 16
targetSdkVersion 27
versionCode 1
versionName "1.0"
}
packagingOptions {
pickFirst 'lib/armeabi/libjni_mix.so'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk"
}
}
}
3、编译weixin模块提示下面的编译错误:
代码语言:javascript复制Error:Execution failed for task ':weixin:transformResourcesWithMergeJavaResForDebug'.
> More than one file was found with OS independent path 'META-INF/DEPENDENCIES'
解决办法: 参照上面的第2个问题,在weixin模块的build.gradle文件中增加下面的编译配置:
代码语言:javascript复制 packagingOptions {
exclude 'META-INF/DEPENDENCIES'
}
二十、调用微信支付返回失败
问题:微信支付返回{"errcode":268497023,"errmsg":"您已完成交易接口升级,老接口交易权限已关闭,请使用新接口进行交易。如有疑问请联系微信支付客服咨询"}。
解决办法:微信支付的SDK需要换成最新版的,修改模块的build.gradle,添加下面一行导入语句:
代码语言:javascript复制implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta: '
当前最新版本号已经到了5.1.4