专栏首页老欧说安卓《Android Studio开发实战 从零基础到App上线》源码运行问题解答

《Android Studio开发实战 从零基础到App上线》源码运行问题解答

本书提供了所有章节的完整源码下载,自上市以来陆续收到读者的意见反馈,现将与源码有关的问题汇总归类如下,方便更多的朋友解决源码运行过程中发现的问题: 一、打开本书源码时,出现“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方法,把下面这行代码:

	String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/";

改为下面这段代码:

	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,具体到代码里则是将下面这行代码

	int nameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);

改为下面这行代码:

	int nameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);

注意network模块的DownloadImageActivity.java和ChatMainActivity.java里的相关代码都要修改。 八、network模块的“http获取图片”按钮进去之后显示不了图片 demo里面的图片地址已失效,需要改成新地址,也就是把GetImageCodeTask.java里面的下面一行代码

    private String mImageCodeUrl = "http://220.160.54.47:82/JSPORTLET/radomImage?x=";

改成下面这行代码:

    private String mImageCodeUrl = "http://222.77.181.14/ValidateCode.aspx?r=";

另外,“下载apk安装包”进去如果发现有的安装包无法下载,那是因为安装包的下载地址已经失效,需要修改DownloadApkActivity.java里面的下载链接。 九、导入mixture模块提示不存在WebScriptActivity 问题原因:当时为了精简本书删了一部分内容,demo的相关代码也删了,AndroidManifest.xml的WebScriptActivity漏了删。 解决办法:把AndroidManifest.xml里的下面这行删除即可

        <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的配置例子如下所示:

    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中增加下面两个权限声明:

<!-- 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模块提示下面的编译错误:

Error:(65, 11) Error: Expected resource of type id [ResourceType]
 public void onClick(View v) {
      ~~
group\src\main\java\com\example\group\adapter\LinearDynamicAdapter.java:66: Error: Expected resource of type id [ResourceType]
  int position = getPosition(v.getId()/10);
  ~~
group\src\main\java\com\example\group\adapter\LinearDynamicAdapter.java:79: Error: Expected resource of type id [ResourceType]

解决办法: 把v.getId()的类型强制转换为int型,即将“v.getId()”改为“(int)v.getId()”。 2、编译mixture模块提示下面的编译错误:

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文件中增加下面的编译配置:

    packagingOptions {
        pickFirst 'lib/armeabi/libjni_mix.so'
    }

修改后的android节点示例如下:

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模块提示下面的编译错误:

Error:Execution failed for task ':weixin:transformResourcesWithMergeJavaResForDebug'.
> More than one file was found with OS independent path 'META-INF/DEPENDENCIES'

解决办法: 参照上面的第2个问题,在weixin模块的build.gradle文件中增加下面的编译配置:

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
    }

二十、调用微信支付返回失败

问题:微信支付返回{"errcode":268497023,"errmsg":"您已完成交易接口升级,老接口交易权限已关闭,请使用新接口进行交易。如有疑问请联系微信支付客服咨询"}。

解决办法:微信支付的SDK需要换成最新版的,修改模块的build.gradle,添加下面一行导入语句:

implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'

当前最新版本号已经到了5.1.4

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《Android Studio开发实战 从零基础到App上线(第2版)》常见问题解答

    问题:第17页“1.5.2 安装SVN工具”这节里面提到的SVN仓库地址要填什么? 回答:SVN仓库地址指的是SVN服务器地址,如果你们单位有专人负责svn代...

    用户4464237
  • 《Android Studio开发实战 从零基础到App上线》本书内容问题答疑

    问题:看安卓开发教程书需要很扎实的java基础吗? 回答:本书的零基础指的是安卓零基础,不是Java零基础,所以看本书之前需要一定的Java基础,基本的变量声...

    用户4464237
  • Android6.0之后的权限机制对App开发的影响

    随着Android系统的更新换代,每次重大更新的方面也逐步扩展,从4.*主要是增强功能,到5.*主要是美化界面,到6.*主要提...

    用户4464237
  • 《Android Studio开发实战 从零基础到App上线》第一版的资源下载和内容勘误

    下面是《Android Studio开发实战 从零基础到App上线》(第一版)一书用到的工具和代码资源: 1、本书使用的Android Studio版本为2....

    用户4464237
  • 《Android Studio开发实战 从零基础到App上线(第2版)》资源下载和内容勘误

    下面是《Android Studio开发实战 从零基础到App上线(第2版)》一书用到的工具和代码资源: 1、本书使用的Android Studio版本为3....

    用户4464237
  • Android开发笔记(一百一十六)网络学习资源

    本系列的开发笔记,对Android开发来说只是沧海一瓢,还有更多的技术等待我们去汲取。下面列出几个常用的开发网站,供初学者上路: 首先当然是国内首屈一指的...

    用户4464237
  • Kotlin入门(1)搭建Kotlin开发环境

    Kotlin做为一门编程语言,已经出现好几年了,但此前在国内并不闻名。自从5月份谷歌宣布它成为Android的官方开发语言之后...

    用户4464237
  • Flutter完整开发实战详解(三、 打包与填坑篇)

    作为系列文章的第三篇,继篇章一和篇章二之后,本篇将为你着重展示:Flutter开发过程的打包流程、APP包对比、细节技巧与问题处理。本篇主要描述的Flutter...

    GSYTech
  • Android 大型工程 App Bundle 模块化实践

    导言 Android App Bundle 是 Android 新推出的一种官方发布格式,可让您以更高效的方式开发和发布应用。企业微信基于 App Bundl...

    微信终端开发团队

扫码关注云+社区

领取腾讯云代金券