Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《第一行代码》中遇到的问题

《第一行代码》中遇到的问题

作者头像
wsuo
修改于 2023-09-23 06:20:26
修改于 2023-09-23 06:20:26
2.1K00
代码可运行
举报
文章被收录于专栏:技术进阶之路技术进阶之路
运行总次数:0
代码可运行

前言:

最近刚刚学完郭霖的第一行代码(第二版)这本书,是我选择入门安卓的一本书,看到很多人都推荐这本书,所以就去图书馆借来趁寒假学习下。但是由于技术是不断更新的,而这本书是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所以没写也不算错,解决办法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
    protected 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,分别对应了更低的通知重要程度。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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时导入依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
c.P360页使用前台服务

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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不一样了 变成这样了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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属性如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">
         <!-- ... -->
    </application>
</manifest>

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/02/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
android学习笔记----解决兼容8.0以上和8.0之前版本通知栏显示、振动、LED呼吸灯闪烁问题(真机验证)
真机(华为荣耀V9,8.0系统),下拉横幅需要手动打开,除非是厂家白名单,比如QQ、微信
砖业洋__
2023/05/06
7380
android学习笔记----解决兼容8.0以上和8.0之前版本通知栏显示、振动、LED呼吸灯闪烁问题(真机验证)
Android通知栏微技巧,8.0系统中通知栏的适配
之前我们已经讲到了,Android 8.0系统最主要需要进行适配的地方有两处:应用图标和通知栏。在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,还没有看过这篇文章的朋友可以先去阅读 Android应用图标微技巧,8.0系统中应用图标的适配 。
用户1158055
2019/07/03
3.3K0
【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 启动相同 id 的第二个前台 Service 关闭通知 )
上一篇博客 【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 ) 实现了一个前台 Service , 在通知栏 , 存在一个通知 ;
韩曙亮
2023/03/29
2.2K0
【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 启动相同 id 的第二个前台 Service 关闭通知 )
Android 8.0无法发送通知栏?通知栏适配通知渠道
  不得不说Andoird的通知栏相比于IOS在使用上有着明显的不足,不仅是体验上的差异,还有大量的非关注通知铺满了通知栏,导致通知栏混乱,杂多。   为什么一个很好的通知栏功能现在却变得这么遭用户讨厌?很大一部分原因都是因为开发者没有节制地使用导致的。每个开发者都只想着尽可能地去宣传自己的App,最后用户的手机就乱得跟鸡窝一样了。但是通知栏又还是有用处的,比如我们收到微信、短信等消息的时候,确实需要通知栏给我们提醒。因此分析下来,通知栏目前最大的问题就是,无法让用户对感兴趣和不感兴趣的消息进行区分。就比如说,我希望淘宝向我推送卖家发货和物流的相关消息,但是我不想收到那些打折促销或者是让我去买衣服的这类消息。那么就目前来说,是没有办法对这些消息做区分的,我要么同意接受所有消息,要么就屏蔽所有消息,这是当前通知栏的痛点。   那么在Android 8.0系统中,Google也是从这个痛点开始下手的。
饮水思源为名
2018/09/06
3.9K0
Android 8.0 简单适配那些事儿
Android 8.0 以发布很长时间了,基于用户设备和市场要求等迟迟没有适配升级;如今适配时遇到一些问题,整理记录一下!官网 对 Android 8.0 新特性以及适配相关的介绍非常清楚,和尚根据官方要求逐步进行适配升级;
阿策小和尚
2019/08/16
1.4K0
Android 8.0 简单适配那些事儿
为应用绑定通知渠道并展示消息角标
为了分清消息通知的轻重缓急,从Android8开始新增了通知渠道,并且必须指定通知渠道才能正常推送消息。一个应用允许拥有多个通知渠道,每个渠道的重要性各不相同,有的渠道消息在通知栏被折叠成小行,有的渠道消息在通知栏展示完整的大行,有的渠道消息甚至会短暂悬浮于屏幕顶部,有的渠道消息在推送时会震动手机,有的渠道消息在推送时会发出铃声,有的渠道消息则完全静默推送,这些提示差别都有赖于通知渠道的特征管理。如果不考虑定制渠道特性,仅仅弄个默认渠道好推送消息,那么只需以下三行代码即可创建默认的通知渠道:
aqi00
2020/04/13
2.5K0
【错误记录】前台进程报错 ( Bad notification for startForeground invalid channel for service notification )
Android 8.0 以上不能用空的通知了 , 必须自己创建通知通道 , 创建通知 ;
韩曙亮
2023/03/29
1.9K0
【错误记录】前台进程报错 ( Bad notification for startForeground invalid channel for service notification )
Android Notification使用
  在应用的开发中,我们必然会接触到应用通知这个知识,而在通知是随着Android版本进行不断变化,为了能在高版本和低版本中使用,就需要开发者去做适配,也属于查漏补缺。了解之前,先看一个效果图吧。
晨曦_LLW
2022/07/12
3K0
Android Notification使用
Android8.0+ 通知适配实战代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); //分组(可选) //groupId要唯一
Zachary46
2018/12/06
1.1K0
【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 )
上一篇博客 【Android 进程保活】提升进程优先级 ( 1 像素 Activity 提高进程优先级 | taskAffinity 亲和性说明 | 运行效果 | 源码资源 ) 使用了前台 Activity , 提升整个进程的优先级 ;
韩曙亮
2023/03/29
2.9K0
【Android 进程保活】提升进程优先级 ( 使用前台 Service 提高应用进程优先级 | 效果展示 | 源码资源 )
android之NotificationManager服务
NotificationManager是一个Android系统服务,用于管理和运行所有通知。
李小白是一只喵
2021/02/05
1.1K0
消息通知Notificatio在8.0上不显示,适配Android8.0
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
黄林晴
2019/08/31
1.4K0
HooK之hook Notification
第一章:android hook介绍 第二章:hook之替换View.OnClickListener 第三章:HooK之hook Notification
李小白是一只喵
2021/02/05
1.4K0
Android6.0到9.0的适配爬坑总结
  大家还记得Android 6.0权限适配的泪水吗?而现在谷歌已经出了Android P的稳定版,而且谷歌粑粑,为了大家能给辛苦熬夜加班,特地的和个大市场合作,要强制推出9.0的适配,而近期在下不才,为了报着多踩坑的心态,做了一下7.0~9.0的适配,脸颊也是老泪两行
用户1269200
2018/12/19
2.1K0
Android6.0到9.0的适配爬坑总结
Android Foreground Service
需要在AndroidManifest 添加 前台服务的权限 : <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
103style
2022/12/19
6530
Android Notification细思极恐的适配
近期项目的迭代版本开发,部门惊喜的申请了一台9.0的机器,是目前部门有史以来第一台8.0以上的机器,满怀喜悦的跑起项目,惊讶地发现Notification的在9.0以上的机器突然不能弹出通知了,惊讶之余发现发通知管理的权限没有开启(就觉得在我的代码怎么会有问题),结果开启了仍然无法接收到通知(打脸了...),马上请教了google大神,发现了毛病
包子388321
2020/06/16
1.4K0
Android 中使用通知Kotlin 版
在 MainActivity 中重写 onRequestPermissionsResult:
龙小雨
2025/05/16
1580
Android各版本迭代信息集合
Android在版本迭代中,总会进行很多改动,那么你熟知各版本都改动了什么内容?又要怎么适配呢?
码上积木
2020/12/15
1.3K0
解决Android8.0之后开启service
项目测试时发现的,在双击返回键关闭应用后(并未杀死后台)重新打开APP,其他手机都OK,但是8.0的手机会出现较频繁的crash。检查代码,问题锁定在重新开启应用时的startService()上。
Anymarvel
2020/07/25
4.6K0
Android通知Notification使用全解析,看这篇就够了
通知是 Android 在您的应用 UI 之外显示的消息,用于向用户提供提醒、来自其他人的通信或来自您的应用的其他及时信息。用户可以点击通知打开您的应用或直接从通知中执行操作。
yechaoa
2022/06/27
7.5K0
Android通知Notification使用全解析,看这篇就够了
推荐阅读
相关推荐
android学习笔记----解决兼容8.0以上和8.0之前版本通知栏显示、振动、LED呼吸灯闪烁问题(真机验证)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档