前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Android Studio开发实战 从零基础到App上线》源码运行问题解答

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

作者头像
aqi00
发布2019-01-18 15:17:05
1.4K0
发布2019-01-18 15:17:05
举报
文章被收录于专栏:老欧说安卓老欧说安卓

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

代码语言: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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档