Android 垃圾分类APP(一)申请API、搭建项目、访问接口获取数据

App演示视频

SVID_20210422_144935_1

前言

  随着垃圾分类的呼声越来越高,未来说不定全国都会实行,因此了解分类可以让你少被罚钱,另外就是这也是为了环保,为了🌏啊。

正文

  既然是一个APP,那么从什么地方开始入手呢?APP最重要的是什么?是数据,任何APP操作的都是数据,只不过形式各不相同,那么垃圾分类的数据从什么地方来呢。网络上有很多的API数据提供商,例如聚合、天行等,这里我将使用天行API,可能会有第一次看博客的朋友,不过我也是第一次写这个垃圾分类APP,因此我们都从头开始吧。

一、申请垃圾分类API

首先注册账号,点击天行数据API进入主页。
在这里插入图片描述
朴实无华的主页,右上角那里就是登录和立即注册,点击立即注册
在这里插入图片描述
这里就是填写基本信息,没啥好说的。填写完毕之后,点击确定注册。注册成功会给你的邮箱发一封邮件。

在这里插入图片描述
去邮箱打开邮件,然后点击链接,通过验证
在这里插入图片描述
验证通过之后,会自动跳转回控制台,然后登录刚才注册的账号即可。之后进入主页面,在搜索框输入 垃圾分类API
在这里插入图片描述
选择第一个垃圾分类
在这里插入图片描述
这个接口是免费的。
在这里插入图片描述
申请这个接口
在这里插入图片描述
立即申请
在这里插入图片描述
立即调试,点击测试请求,会通过这个key去请求接口。
在这里插入图片描述
返回的数据如下:

{
  "code": 200,
  "msg": "success",
  "newslist": [
    {
      "name": "太阳眼镜",
      "type": 3,
      "aipre": 0,
      "explain": "干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。",
      "contain": "常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物",
      "tip": "尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"
    },
    {
      "name": "智能眼镜",
      "type": 0,
      "aipre": 0,
      "explain": "可回收垃圾是指适宜回收、可循环利用的生活废弃物。",
      "contain": "常见包括各类废金属、玻璃瓶、易拉罐、饮料瓶、塑料玩具、书本、报纸、广告单、纸板箱、衣服、床上用品、电子产品等",
      "tip": "轻投轻放;清洁干燥,避免污染,费纸尽量平整;立体包装物请清空内容物,清洁后压扁投放;有尖锐边角的、应包裹后投放"
    },
    {
      "name": "游泳眼镜",
      "type": 3,
      "aipre": 0,
      "explain": "干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。",
      "contain": "常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物",
      "tip": "尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"
    },
    {
      "name": "眼镜",
      "type": 3,
      "aipre": 0,
      "explain": "干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。",
      "contain": "常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物",
      "tip": "尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"
    },
    {
      "name": "眼镜布",
      "type": 3,
      "aipre": 0,
      "explain": "干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。",
      "contain": "常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物",
      "tip": "尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"
    },
    {
      "name": "眼镜架",
      "type": 3,
      "aipre": 0,
      "explain": "干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。",
      "contain": "常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物",
      "tip": "尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"
    },
    {
      "name": "眼镜框",
      "type": 3,
      "aipre": 0,
      "explain": "干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。",
      "contain": "常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物",
      "tip": "尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"
    },
    {
      "name": "眼镜盒",
      "type": 3,
      "aipre": 0,
      "explain": "干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。",
      "contain": "常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物",
      "tip": "尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"
    },
    {
      "name": "隐形眼镜",
      "type": 3,
      "aipre": 0,
      "explain": "干垃圾即其它垃圾,指除可回收物、有害垃圾、厨余垃圾(湿垃圾)以外的其它生活废弃物。",
      "contain": "常见包括砖瓦陶瓷、渣土、卫生间废纸、猫砂、污损塑料、毛发、硬壳、一次性制品、灰土、瓷器碎片等难以回收的废弃物",
      "tip": "尽量沥干水分;难以辨识类别的生活垃圾都可以投入干垃圾容器内"
    },
    {
      "name": "隐形眼镜包装盒",
      "type": 0,
      "aipre": 0,
      "explain": "可回收垃圾是指适宜回收、可循环利用的生活废弃物。",
      "contain": "常见包括各类废金属、玻璃瓶、易拉罐、饮料瓶、塑料玩具、书本、报纸、广告单、纸板箱、衣服、床上用品、电子产品等",
      "tip": "轻投轻放;清洁干燥,避免污染,费纸尽量平整;立体包装物请清空内容物,清洁后压扁投放;有尖锐边角的、应包裹后投放"
    }
  ]
}

非常简单,下面我再介绍一些常识,刚才的测试是不计入每天的次数统计的,普通会员每天100次免费,超过之后则会扣天豆。天豆可以在我的控制台查看,不建议充值,个人开发的话,基本免费的次数够用了。
在这里插入图片描述
那么现在的接口地址就有了,如下:

http://api.tianapi.com/txapi/lajifenlei/index?key=783da68c7ea7e10fcd259db651cc550b&word=眼镜

这里面的key换成自己的,我这每天一百的免费量可经不起折腾啊。

二、创建项目

下面来创建Android项目了,打开Android Studio,项目命名为:GoodTrash。
翻译过来就是 好垃圾。这个名字是不是挺有意思的,它有三层意思,第一是英文直译,第二就是好的垃圾,第三就是好垃圾指这个项目。
在这里插入图片描述
既然是网络API接口,那么首先应该解决网络的问题。先来配置网络访问环境,第一个就是http的访问许可,Android9.0之后默认使用https访问网络,而这个垃圾分类的接口是http格式的,因此先增加许可。

在res下新建一个xml文件夹,文件夹下新建network_config.xml,里面的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

如下所示:
在这里插入图片描述
为了使这个配置生效,需要到AndroidManifest.xml中配置,如下所示:
在这里插入图片描述

我在manifest标签下配置网络权限,这样应用就可以访问网络了。在application标签下配置刚才的xml文件,这样就可以通过http访问网络了。

在xml文件夹下新建一个file_paths.xml,里面的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="" />
</paths>

然后在AndroidMainfest.xml的application标签下增加如下代码:

		<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.llw.goodtrash.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"/>
        </provider>

下面配置工程的build.gradle,在里面增加jitpack库。

	maven { url "https://jitpack.io" }

在这里插入图片描述
然后修改app的build.gradle,在android{}闭包下增加如下代码:

	compileOptions {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }

然后Sync Now同步一下。为了简化开发中的过程了,我这里打算使用mvp框架,也是我之前写的一篇文章,mvp框架中又使用了网络访问框架,也是一篇文章。如果你对这两者一点都没有概念的话,建议你先看看这两篇文章。

Android OkHttp+Retrofit+RxJava搭建网络访问框架(含源码)

Android MVP框架搭建与使用(含源码)

那么我就在当前的项目中引入这个mvp框架,首先下载这个框架的源码,
MvpDemo.rar
这是不需要积分的,下载后解压。然后打开在当前AS中引入mvp模块,
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
然后再点击Next,等待加载到你的项目之后。

之后点击这个图标,进入项目结构。
在这里插入图片描述
我们现在的mvp框架虽然移动进来了,但是app模块需要依赖才能使用。
在这里插入图片描述
mvp是一个模块,因此最终选择的是模块依赖,
在这里插入图片描述
点击OK,然后你会发现有报错。
在这里插入图片描述
这是重复使用了配置文件的原因。打开mvplibrary的AndroidManifest.xml
在这里插入图片描述
删掉我标注的这句话。然后点击这个小象图标重新同步配置项目
在这里插入图片描述
然后就正常了,下面我们可以来访问接口了。

三、访问API接口

可以在MainActivity中写一个这样的方法,通过使用Okhttp来请求API接口,这里使用的是Get请求,也都是常规的代码。由于变化的只有物品,因此作为入参传进来。

	private void getRecognitionResult(String goods) {
        //使用Get异步请求
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                //拼接访问地址
                .url("http://api.tianapi.com/txapi/lajifenlei/index?key=783da68c7ea7e10fcd259db651cc550b&word=" + goods)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String result = response.body().string();
                if (response.isSuccessful()) {//回调的方法执行在子线程。
                    Log.d("result: ", result);
                }
            }
        });
    }

然后在onCreate中调用

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取识别的结果
        getRecognitionResult("眼镜");
    }

下面运行一下,通过日志打印出来识别的结果:
在这里插入图片描述
然后把刚才的眼镜改成羽毛球,再运行一下:
在这里插入图片描述
你会发现这个数据比刚才少了很多,这说明返回数据的结果是根据不同的物品来的,因此这个结果必定是一个可变数组,所以你不能写死。

四、源码

GitHub源码地址如下:GoodTrash

文末

本来是不想做这样的系列APP文章的,因为写起来太费劲,比写代码花的时间多,但是我要是直接给几个效果图,然后贴上源码,一些刚学习Android的朋友又不能理解,所以为了使初学者能够看懂,这个垃圾分类APP我也会从头到尾写博文讲解每一步。

### 创建使用传感器接口的应用程序 为了在 Android Studio 中创建个能够利用传感器接口的应用程序,开发者需要理解如何集成 `SensorManager` 来获取设备上的各种传感器数据。下面是个详细的指南以及相应的代码片段。 #### 准备工作 确保项目配置支持最低 SDK 版本为 API Level 9 或以上[^1]。这步骤对于访问现代移动设备中的大多数内置硬件特性至关重要。 #### 添加权限声明 虽然大部分传感器操作无需特殊权限即可执行,但如果应用程序打算处理位置信息或其他敏感功能,则应在 `AndroidManifest.xml` 文件内适当添加相应权限请求: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 如果应用需要用到地理位置 --> ``` #### 初始化 SensorManager 实例 通过上下文对象获得对 `SensorManager` 的引用,并注册监听器以便接收来自特定类型的传感器事件通知。这里展示了个简单的例子,在活动中完成这些设置: ```java import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; public class MainActivity extends AppCompatActivity implements SensorEventListener { private SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取默认的 SensorManager 对象实例 sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 注册加速度计传感器 registerAccelerometer(); } private void registerAccelerometer() { Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); if (accelerometer != null){ sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); } } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) {} @Override public void onSensorChanged(SensorEvent event) { float[] values = event.values; String textToShow = "X: "+values[0]+", Y:"+values[1]+ ", Z:" +values[2]; ((TextView)findViewById(R.id.sensorData)).setText(textToShow); } } ``` 上述代码展示了如何初始化 `SensorManager` 并为其指定个具体的传感器——在这里选择了加速计作为示范案例。每当检测到变化时,都会触发 `onSensorChanged()` 方法更新 UI 上显示的数据[^3]。 #### 清理资源 当不再需要继续监控某个传感器的变化时(比如活动暂停或销毁),应当记得调用 `unregisterListener()` 取消订阅以节省电量并释放系统资源: ```java @Override protected void onPause(){ super.onPause(); sensorManager.unregisterListener(this); } @Override protected void onResume(){ super.onResume(); registerAccelerometer(); } ``` 这样就完成了基本框架搭建,接下来可以根据实际需求进步扩展逻辑实现更多复杂的功能。
评论 63
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初学者-Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值