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

2019-01-18 15:17:05 浏览数 (1)

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

0 人点赞