前言:

最近刚刚学完郭霖的第一行代码(第二版)这本书,是我选择入门安卓的一本书,看到很多人都推荐这本书,所以就去图书馆借来趁寒假学习下。但是由于技术是不断更新的,而这本书是16年的,虽然也算是市面上比较新的安卓书籍,但是由于技术的更新速度实在是太快,所以楼主学习的时候2020年,已经有点过时了,导致有一些方法和库更新之后有问题,在此记录下来,也希望帮到以后拿这本书来学习的朋友。

一、开发环境

楼主使用的是Android studio 3.5.2
gradle:5.4.1
Android gradle plugin Version :3.5.2
JDK8,targetSDK 28
书中所有的实例都是用的真机调试(小米8)为安卓9系统

二、遇到的问题

1.前七章的问题

前七章几乎没有什么问题,因为涉及的知识点不多也很简单,大多数是介绍,只有一个问题就是用到第三方库的时候,书上是gradle2.+版本,而我用的是gradle3.+版本,这两个版本的区别就在于:

gradle2.+是使用compile ‘库名’
gradle3.+是使用implement ‘库名’

还有一个 第6章 数据存储全方案——详解持久化技术 的时候会让你去adb查看android模拟器中SQLlite的表是否创建成功,我的建议就是就别去看了,我弄了半天就是获取不了管理员权限,很麻烦也浪费时间,你知道有这回事就行了,不用深究。

其他的就没什么了

2.第八章丰富你的程序——运用手机多媒体

这里有个问题,就是安卓8之后通知必须要有通道,也就是说每个通知都属于某一个特定的通道,我们必须要先声明通道,而书上是安卓7所以没写也不算错,解决办法:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//首先要确保的是当前手机的系统版本必须是Android 8.0系统或者更高if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {String channelId = "chat";String channelName = "聊天信息";int importance = NotificationManager.IMPORTANCE_HIGH;createNotificationChannel(channelId, channelName, importance);channelId = "subscribe";channelName = "订阅消息";importance = NotificationManager.IMPORTANCE_DEFAULT;createNotificationChannel(channelId, channelName, importance);}}//创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这三个参数@RequiresApi(api = Build.VERSION_CODES.O)private void createNotificationChannel(String channelId, String channelName, int importance) {NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);channel.setShowBadge(true); //允许渠道下的通知显示脚标NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);notificationManager.createNotificationChannel(channel);}

白白的页面出来一个黑色的代码块怪怪的…

代码不长,我来简单解释下。这里我们在MainActivity中创建了两个通知渠道,首先要确保的是当前手机的系统版本必须是Android 8.0系统或者更高,因为低版本的手机系统并没有通知渠道这个功能,不做系统版本检查的话会在低版本手机上造成崩溃。

创建一个通知渠道的方式非常简单,这里我封装了一个createNotificationChannel()方法,里面的逻辑相信大家都看得懂。需要注意的是,创建一个通知渠道至少需要渠道ID、渠道名称以及重要等级这三个参数,其中渠道ID可以随便定义,只要保证全局唯一性就可以。渠道名称是给用户看的,需要能够表达清楚这个渠道的用途。重要等级的不同则会决定通知的不同行为,当然这里只是初始状态下的重要等级,用户可以随时手动更改某个渠道的重要等级,App是无法干预的。

上述代码我是模拟了这样一个场景。想象一下我们正在开发一个类似于微信的App,其中App通知主要可以分为两类,一类是我和别人的聊天消息,这类消息非常重要,因此重要等级我设为了IMPORTANCE_HIGH。另一类是公众号的订阅消息,这类消息不是那么重要,因此重要等级我设为了IMPORTANCE_DEFAULT。除此之外,重要等级还可以设置为IMPORTANCE_LOW、IMPORTANCE_MIN,分别对应了更低的通知重要程度。

之后你再想使用通知的时候就应该这样写:

new NotificationCompat.Builder(this, "chat")

这里的chat是之前定义的,你可以随便换

3.第九章:看精精彩彩的世界——使用网络技术

a.P313页,书上访问的是

http://www.baidu.com

而 9.0系统已经默认不支持http请求了,谷歌默认要求链接是加密链接了,也就是必须是https开头的
要解决这个问题有几种方案:

  1. 第一个是把http改成https
  2. 还有一个就是把targetSdkVersion 改成27或者以下
  3. 还有一个方案就是在res目录添加一个xml文件夹,新建一个xml
    包括后面的P316页也要使用HttpsURLConnection实例

b.P319页:使用OkHttp时导入依赖

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

c.P360页使用前台服务

与第八章同理,需要使用通知频道,如下:

@Override
public void onCreate() {super.onCreate();Log.d(TAG, "onCreate: executed");//首先要确保的是当前手机的系统版本必须是Android 8.0系统或者更高if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {String channelId = "subscribe";String channelName = "订阅消息";int importance = NotificationManager.IMPORTANCE_HIGH;createNotificationChannel(channelId, channelName, importance);}Intent intent = new Intent(this, MainActivity.class);PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);Notification notification = new NotificationCompat.Builder(this, "subscribe").setContentTitle("This is content title").setContentText("This is content text").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).setContentIntent(pi).build();startForeground(1, notification);   //让MyService变成一个前台服务
}@RequiresApi(api = Build.VERSION_CODES.O)
private void createNotificationChannel(String channelId, String channelName, int importance) {NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);channel.setShowBadge(true); //允许渠道下的通知显示脚标NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);notificationManager.createNotificationChannel(channel);
}

4.第十章服务的最佳实践——完整版的下载实例

这里面有一个权限的申请的声明也和安卓7不一样了
变成这样了:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

5.第十一章

百度地图SDK下载地址也不是原来的了: 百度地图接口

另外由于改版了,书中所说的版本升级了,我下载的是全量定位+基础地图

6.第十四章——酷欧天气

之前粗略介绍了下无法访问http协议的方法,现在补充一下第三种方法,因为作者给的网址只能用http访问,加了s就访问不了了,所以我们只能详细的配置xml了:

第一步:在清单文件AndroidManifest.xml的application标签里面设置networkSecurityConfig属性如下:

 <?xml version="1.0" encoding="utf-8"?>
<manifest ... ><application android:networkSecurityConfig="@xml/network_security_config"><!-- ... --></application>
</manifest>

第二步:在资源文件夹res/xml下面创建network_security_config.xml如下:

<?xml version="1.0" encoding="utf-8"?><network-security-config>    <base-config cleartextTrafficPermitted="true">        <trust-anchors>            <certificates src="system" />        </trust-anchors>    </base-config></network-security-config>

另外他给的连接我也附上,这样大家就不用照着书上一个字母一个字母的敲了:

http://guolin.tech/api/weather?cityid=CN101130101&key=bc0418b57b2d4918819d3974ac1285d9

http://guolin.tech/api/bing_pic
http://cn.bing.com/th?id=OHR.ReddishEgret_ROW6202849447_1920x1080.jpg&rf=LaDigue_1920x1081920x1080.jpg

有人说和风天气的接口不能注册不能使用了,我试了一下一切正常,可以注册,一天1000个访问量没问题的,如果想要跟多可以在上面免费升级成为开发者。

三、结语

以上就是我读这本书遇到的所有问题了,另外最后的酷欧天气我开发完了也已经上传到GitHub上了,而且后期会将功能完善,如果你想参考一下也欢迎来fork如果你有什么问题欢迎在下方留言或者联系我:

我的邮箱:ws2821@yeah.net
我的GitHub:https://github.com/wsuo

参考文章:

1.安卓8.0系统中通知栏的适配
2.《第一行代码(第2版)》中碰到的问题

《第一行代码》中遇到的问题相关推荐

  1. 《第一行代码》 编写精美的聊天界面

    第一部分:9.png图像的制作 遥想当年Android2.3的时代,手机不Root那基本没得玩,我那个时候荒废了不少时间搞什么系统美化,反编译啊什么的.虽然到头来竹篮打水,但是也算对计算机有了一定的兴 ...

  2. html中第一行代码,HTML5 CSS3初学者指南(1) – 编写第一行代码

    介绍 网络时代已经到来.现在对人们来说,每天上网冲浪已经成为一种最为常见的行为. 在网页浏览器中输入一段文本地址,就像http://www.codeproject.com,等待一下,网页就加载到浏览器 ...

  3. 《第一行代码》12.2学习中遇到的一些问题and心得

    1.书中P411中的activity_main.xml中的Toolbar不应该使用<android.support.v7.widget.Toolbar/> 应该使用<androidx ...

  4. 【Lua 教程系列第 4 篇】Lua 中的第一行代码 hello world

    这是[Lua 教程系列第 4 篇],如果觉得有用的话,欢迎关注专栏. 接着上一篇博客继续写. 这里我的 lua 文件名起名为"LuaTest",接着输入 print("h ...

  5. 【读书笔记】《第一行代码》

    <第一行代码>读书笔记 一.引言 转眼间,毕业工作已经八个半月了. 但是实际上,随着开发的深入,越发觉得自己知识点和技术栈的浅薄.在学校期间,往往对知识的积累不够重视,认为轮子转起来了就皆 ...

  6. Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  7. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  8. Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  9. Android Studio 单刷《第一行代码》系列 04 —— Activity 相关

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

最新文章

  1. 良心贴!没想到 Google 排名第一的编程语言,可以这么简单!
  2. 深度学习运行python文件,出现跨路径搜索其他module,怎么解决?
  3. hung_task_timeout_secs和blocked for more than 120 seconds的解决方法
  4. id和class到底要用哪一个?
  5. 斯坦福大学深度学习与自然语言处理第二讲:词向量
  6. React Native获取手机的各种高度
  7. 【Java开发】生成二维码
  8. python默认参数举例_Python中的默认参数实例分析
  9. jQuery DOM 节点操作
  10. 项目中的textarea遇到的小问题
  11. php 字符 index,php函数之字符串篇String
  12. C#编码简单性之泛型篇(如何编写简短的C#代码,随时更新)
  13. Kubernetes 开发流程中的三个关键步骤
  14. Linux 基金会发布《软件物料清单和网络安全准备度现状》报告
  15. 深度学习中的梯度下降算法
  16. 主板开启网络唤醒_主板远程唤醒设置
  17. mysql pdo连接不上_通过PDO连不上数据库
  18. 爱了爱了!今年最好用的手机表格制作软件!
  19. 【树莓派】树莓派系统安装
  20. http状态码200,300,404等是什么意思

热门文章

  1. [BZOJ1853][SCOI2010][容斥原理]幸运数字
  2. 爬虫学习5——requests进阶(cookie登录、防盗链、
  3. 电脑知识 小技巧汇总
  4. 电脑里的计算机无法打字,电脑键盘无法打字的原因及解决方案
  5. 计算机类高级职称考哪个职称英语,计算机专业考职称英语3个类别
  6. 查看网页原代码时遇到中文汉字乱码
  7. Ubuntu20.04部署微软counterfit AI系统安全测评工具实战
  8. ubuntu 小米笔记本wifi问题
  9. 达梦2245_达梦创建link访问oracle
  10. 百度贴吧爬虫:理解网页的加载过程